记录一次对NSString和NSMutableString的引用计数操作
先将项目变成MRC模式(target->build Settings)

加入下面代码

- (void)viewDidLoad {
[super viewDidLoad];
NSString *str0 = [[NSString alloc] init];
NSMutableString *mStr0 = [[NSMutableString alloc] init];
NSLog(@"%ld<>%ld",[str0 retainCount],[mStr0 retainCount]);
NSString *str1 = @"abc";
NSLog(@"%ld",[str1 retainCount]);
[str1 retain];
NSLog(@"%ld",[str1 retainCount]);
[str1 release];
NSLog(@"%ld",[str1 retainCount]);
self.str2 = str1;
NSLog(@"%ld",[self.str2 retainCount]);
NSMutableString *str3 = [NSMutableString stringWithFormat:@"%@ccc",str1];
NSLog(@"str3 = %ld,str4 = %ld",[str3 retainCount],[self.str4 retainCount]);
self.str4 = str3;
NSLog(@"str3 = %ld,str4 = %ld",[str3 retainCount],[self.str4 retainCount]);
[str3 retain];
NSLog(@"str3 = %ld,str4 = %ld",[str3 retainCount],[self.str4 retainCount]);
}
结论

分析
- NSString是在栈中,栈中变量的生命周期由系统管理,所以对它进行操作是 -1;
- NSMutableString是在堆中分配内存,retainCount表示有多少根强引用线引用着这个对象,当为 0 的时候就回收。