Во время тестирования кода я столкнулся с проблемой. Слушай мой код и журнал.
(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 уже освобожден!
Если я дважды отправлю сообщение получателю, где находится первая позиция?
Может кто-нибудь сказать мне, где это?
Спасибо.