iOS NSString retainCount遇到的問題

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的區別,還需要多理解下內存管理方面的知識。

發佈了90 篇原創文章 · 獲贊 2 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章