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程序设计》