iOS NSString真是個奇葩啊!

weixin_34290000發表於2017-02-15

遷移自開源中國

一直認為像這樣寫會造成記憶體洩露呢!可是我好像真的錯了。

NSString *textStr = @"abc";
if (YES) {
   textStr = @"def";
}
NSLog(@"textStr is %@", textStr);

這樣寫一點問題都沒有,因為在OC中有個常量字串(NSConstantString)的概念,而它是不需要手動release的。我又做了測試如下

NSString *str = @"dddd";
while (YES) {
    str = @"aaaaaaaaa";
    NSLog(@"%@   %d", str, str.retainCount);
}

執行了足足10分鐘,記憶體一點沒漲,又做了如下測試

NSArray *array = @[@"dddd", @"dddd"];
while (YES) {
    array = @[@"dddddddddd"];
    NSLog(@"%@", array[0]);
}

執行期間,記憶體呈直線上升,兩種測試cpu幾乎爆滿。
接下來又錯了如下測試

NSString *str = @"dddd";
while (YES) {
    str = [[NSString alloc] initWithString:@"4321"];
    NSLog(@"%@   %d", str, str.retainCount);
}

結果記憶體依然不漲,所以真的沒問題,但是最後這種情況不建議,因為要遵循官網的記憶體管理原則,要加上release。
另外這樣寫不會報錯的。

NSString *str = @"dddd";
[str release];
NSLog(@"str is %@", str);

相關文章