您的位置:首页 > 移动开发 > IOS开发

iOS NSString retainCount遇到的问题

2016-06-22 16:55 507 查看

NSString的内存管理

昨天做了一道面试题,第一题就是关于NSString的内存管理的,直接上代码。

现有如下person.m文件,请写出test方法执行后的输出。

@interface Parent : NSObject

@property(nonatomic, strong) NSString *sstr;
@property(nonatomic, copy) NSString* cstr;

- (void)test;

@end

@implementation Parent

- (void)test{
NSString *str = [NSString stringWithFormat:@"hello"];
self.sstr = str;
self.cstr = str;
NSLog(@"str: %d %@",(int)[str retainCount],str);
NSLog(@"sstr: %zi %@",[self.sstr retainCount],str);
NSLog(@"cstr: %zi %@",[self.cstr retainCount],str);

NSMutableString *mstr = [NSMutableString stringWithFormat:@"hello2"];
self.sstr = mstr;
self.cstr = mstr;
NSLog(@"str2: %zi %@",[mstr retainCount],mstr);
NSLog(@"sstr: %zi %@",[self.sstr retainCount],self.sstr);
NSLog(@"cstr: %zi %@",[self.cstr retainCount],self.cstr);
}

@end


在xcode7.2 的系统上,iPhone6s,iOS9.1的系统上打印的是

2016-06-22 16:39:15.791 test[743:263379] str: -1 hello
2016-06-22 16:39:15.792 test[743:263379] sstr: -1 hello
2016-06-22 16:39:15.792 test[743:263379] cstr: -1 hello
2016-06-22 16:39:15.792 test[743:263379] str2: 2 hello2
2016-06-22 16:39:15.792 test[743:263379] sstr: 2 hello2
2016-06-22 16:39:15.792 test[743:263379] cstr: -1 hello2


但是在iPhone4s,iOS7上面打印的是

2016-06-22 16:40:41.444 test[316:60b] str: 3 hello
2016-06-22 16:40:41.450 test[316:60b] sstr: 3 hello
2016-06-22 16:40:41.453 test[316:60b] cstr: 3 hello
2016-06-22 16:40:41.456 test[316:60b] str2: 2 hello2
2016-06-22 16:40:41.460 test[316:60b] sstr: 2 hello2
2016-06-22 16:40:41.463 test[316:60b] cstr: 1 hello2


感觉很奇怪,先说下在iOS9.1上的问题吧,大家可以参考

Objective-C中NSString对象retainCount之谜探索

NSString特性分析学习

看了半天也没有理解清楚,只是知道,如果用

NSString *str1 = @"1234567890";


字符串常量,类似于C语言形式,静态区存储,系统不会采用计数方式回收,所以不会对其作引用计数,即使我们对s如何retain或release,其值保持不变,对象也保持不变。

关于retain和copy的区别,还需要多理解下内存管理方面的知识。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息