Перевыпуск объекта, и приложение не падает - PullRequest
4 голосов
/ 22 марта 2012
@property (retain) NSString *testString;
self.testString = [[NSString alloc] initWithString:@"aaa"];
[self.testString retain];    
self.testString = [NSString stringWithString:@"a"];
[self.testString release];
[self.testString release];

Пойдем строка за строкой:

Строка 2: сохранить счет testString = 2Строка 3: сохранить счет testString = 3Строка 4: сохранить счет testString = 1Строка 5: сохранить счет testString = 0Строка 6: она должна потерпеть крах

Даже если в CoreFoundation есть другие вещи, удерживающие testString, они со временем исчезнут.Но приложение никогда не падает из-за этого.

Кто-нибудь может объяснить это?Спасибо!

Ответы [ 3 ]

5 голосов
/ 22 марта 2012

посмотрите этот код и его журнал:

NSString *string1 = [NSString stringWithString:@"a"];
NSString *string2= @"a";
NSLog(@"String1: %p", string1);
NSLog(@"String2: %p", string2);

2012-03-22 13:21:49.433 TableDemo[37385:f803] String1: 0x5860
2012-03-22 13:21:49.434 TableDemo[37385:f803] String2: 0x5860

, как вы видите [NSString stringWithString:@"a"]; не создает новую строку, она использует строковый литерал @ "a".И строковые литералы не могут быть освобождены.

Попробуйте свой код с NSMutableString, и вы увидите сбой.

4 голосов
/ 22 марта 2012

Я не эксперт по этому поводу, поэтому, пожалуйста, примите это с крошкой соли.Я предполагаю, что [NSString stringWithString:@"a"], вероятно, просто вернет буквальную строку @"a", то есть просто вернет аргумент.Поскольку @"a" является литералом, он, вероятно, находится в постоянной памяти и не может быть освобожден (поэтому его следует инициализировать с очень высоким счетом сохранения).

0 голосов
/ 22 марта 2012

[NSString stringWithString:@"a"] возвращает автоматически освобожденный объект. Это означает, что «истинное» количество сохранений равно 2, а не 1 в строке 4. В строке 6 вы перевыпускаете свою переменную, но сбой произойдет позже - при сливе из пула автоматического выпуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...