引用计数和字符串

 

int main(int argc, char *argv[]){

NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];

    

    NSString *myStr1=@"Constant string";

    NSString *myStr2=[NSString stringWithString:@"string2"];

    NSMutableString *myStr3=[NSString stringWithString:@"string3"];

    

    NSMutableArray *myArr=[NSMutableArray array];

    

    NSLog(@"Retain count:myStr1:%lx, myStr2:%lx, myStr3:%lx",(unsigned long)[myStr1 retainCount],(unsigned long)[myStr2 retainCount],(unsigned long)[myStr3 retainCount]);

    

    [myArr addObject:myStr1];

    [myArr addObject:myStr1];

    [myArr addObject:myStr3];

    

    NSLog(@"Retain count:myStr1:%lx, myStr2:%lx, myStr3:%lx",(unsigned long)[myStr1 retainCount],(unsigned long)[myStr2 retainCount],(unsigned long)[myStr3 retainCount]);

    

    [myArr addObject:myStr1];

    [myArr addObject:myStr1];

    [myArr addObject:myStr3];

    

    NSLog(@"Retain count:myStr1:%lx, myStr2:%lx, myStr3:%lx",(unsigned long)[myStr1 retainCount],(unsigned long)[myStr2 retainCount],(unsigned long)[myStr3 retainCount]);

    

    [myStr1 retain];

    [myStr2 retain];

    [myStr3 retain];

    

    NSLog(@"Retain count:myStr1:%lx, myStr2:%lx, myStr3:%lx",(unsigned long)[myStr1 retainCount],(unsigned long)[myStr2 retainCount],(unsigned long)[myStr3 retainCount]);

    

[pool drain];

}

输出结果:

Retain count: myStr1:ffffffff, myStr2:ffffffff, myStr3:1

Retain count: myStr1:ffffffff, myStr2:ffffffff, myStr3:2

Retain count: myStr1:ffffffff, myStr2:ffffffff, myStr3:3

将NSString对象myStr1赋值为NSConstantString @Constant string”。内存中常量字符串的空间分配与其他对象不同,它们没有引用计数机制,因为永远不能释放这些对象,这就是为什么向mystr1发送消息retainCount,而它返回0xffffffff的原因。而变量myStr3被设置为常量字符串的副本(NSMutableString *myStr3=[NSString stringWithString:@"string3"];)。制作字符串副本的原因是向NSMutableString类发送了stringWithString消息,表明该字符串的内容可能在程序执行期间发生变化。由于常量字符串的内容是不能改变的,所以系统不能将变量myStr3设为指向常量字符串@"string3",而myStr2可以。

 

整理摘自《objective-c 2.0程序设计》

转载于:https://my.oschina.net/u/574245/blog/111096

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值