NSString проблема выпуска - PullRequest
0 голосов
/ 03 июня 2011

Во время тестирования кода я столкнулся с проблемой. Слушай мой код и журнал.

(IBAction) DynamicBtnClicked:(id)sender 
{
 NSString *strLog = [[NSString alloc] initWithString:@"SubView Index is..."];
 NSLog(@"initialized strLog address is = %p, retainCount = %d", strLog, [strLog retainCount]);
 if ([self.view.subviews count] > 0) {
     for (int i = 0 ; i < [self.view.subviews count] ; i++) {
         UIView *tmpView = [self.view.subviews objectAtIndex:i];
         strLog = [strLog stringByAppendingFormat:@"%d view`s index = %d, tag = %d", i, i,[tmpView tag]];
         NSLog(@"appended strLog address is = %p, retainCount = %d", strLog, [strLog retainCount]);
     }
 }

 NSLog(@"after appended strLog address is = %p, retainCount = %d", strLog, [strLog retainCount]);    
 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:strLog delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
 [alert show];
 [alert release];

 NSLog(@"after using strLog address is = %p, retainCount = %d", strLog, [strLog retainCount]);
 [strLog release];
}

и ниже - Log

2011-06-03 14:36:11.038 MakeViewUsingCode[3918:40b] initialized strLog address is = 0x45c4, retainCount = 2147483647
2011-06-03 14:36:11.039 MakeViewUsingCode[3918:40b] appended strLog address is = 0x9c028d0, retainCount = 1
2011-06-03 14:36:11.040 MakeViewUsingCode[3918:40b] appended strLog address is = 0x9c021b0, retainCount = 1
2011-06-03 14:36:11.041 MakeViewUsingCode[3918:40b] after appended strLog address is = 0x9c021b0, retainCount = 1
2011-06-03 14:36:11.081 MakeViewUsingCode[3918:40b] after using strLog address is = 0x9c021b0, retainCount = 3
2011-06-03 14:36:11.087 MakeViewUsingCode[3918:40b] *** -[CFString release]: message sent to deallocated instance 0x9c021b0
dlopen(/Developer/Library/Xcode/PrivatePlugIns/DebuggerFoundation.ideplugin/Contents/Resources/DebuggerIntrospectionSupport.dylib, 0x0000000A)
dyld: loaded: /Developer/Library/Xcode/PrivatePlugIns/DebuggerFoundation.ideplugin/Contents/Resources/DebuggerIntrospectionSupport.dylib
Current language:  auto; currently objective-c

Я знаю, в моем коде есть утечка памяти, но это не является реальной проблемой. (Это было специально).

Настоящая проблема в том, что когда я запускаю свой код, возникает ошибка времени выполнения EXC_BAD_ACCESS.

В моем коде я отправляю сообщение получателю для освобождения, но журнал показывает мне, что причина ошибки в том, что экземпляр объекта NSString уже освобожден!

Если я дважды отправлю сообщение получателю, где находится первая позиция?

Может кто-нибудь сказать мне, где это?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 июня 2011

Не надейтесь на retainCount сильно. Они могут вводить в заблуждение. Просто придерживайтесь правил управления памятью, и у вас все получится. Проблема здесь в этой строке,

strLog = [strLog stringByAppendingFormat:@"%d view`s index = %d, tag = %d", i, i,[tmpView tag]];

После этого strLog указывает на автоматически выпущенную строку. Вы не заявили право собственности на эту строку, но все же вы освобождаете ее в конце метода. Итак, представьте, что он был создан один раз и выпущен дважды. Это твоя проблема. Если вы просто хотите добавить строку к созданному вами экземпляру, вам нужно будет использовать NSMutableString.

0 голосов
/ 03 июня 2011

Когда вы присваиваете эту новую строку strlog в первый раз в цикле, вы теряете ссылку на первую строку.

NSString *strLog = [[NSString alloc] initWithString:@"SubView Index is..."];
for (int i = 0 ; i < [self.view.subviews count] ; i++) {
     // since you're not releasing the current reference, it's replaced with 
     // the following reference and thus leaked
     strLog = [strLog stringByAppendingFormat:@"%d view`s index = %d, tag = %d", i, i,[tmpView tag]];
}

I считаю , что stringByAppendingFormat возвращаетАвто-релиз NSString.Если это так, я подозреваю, что ошибка, которую вы видите, заключается в том, что вы дважды освобождаете последнюю ссылку на strLog (неявное автоматическое освобождение при создании объекта и явное освобождение в конце метода).

...