我遇到这种情况,我在一个辅助类的实例中复制了一个字符串,保留了它,然后在分配了辅助类的视图控制器实例的dealloc
期间释放了它。这导致了可怕的EXC_BAD_ACCESS。然后我去了仪器调试僵尸。这给了我以下错误:
将Objective-C消息发送到已解除分配的CFString(不可变)'对象(僵尸)在地址:blah blah
当我查看Instruments中的分配摘要并从僵尸检测中向后工作时,我的代码第一次列出是在助手类实例的解除分配中。这是助手类的样子。首先是.h文件:
@interface channelButtonTitles : NSObject {
NSString *channelTitle;
...
}
@property (nonatomic,copy) NSString *channelTitle;
...
@end
然后是.m文件:
@implementation channelButtonTitles
@synthesize channelTitle;
...
- (void)dealloc {
[channelTitle release];
...
}
@end
现在,使用帮助程序类的视图控制器中的相关代码如下所示。在.h文件中,我有一个数组,它将保存辅助类的多个对象,如下所示:
@interface MyVC : UIViewController {
NSMutableArray *channelTitles;
...
}
@property (retain, nonatomic) NSMutableArray *channelTitles;
然后在.m代码中,我合成channelTitles
。我还有一个dealloc
方法如下:
- (void)dealloc {
[channelTitles release];
...
}
最后,我分配了助手类的对象实例,并将它们存储在channelTitles
中,其中的字符串存储在channelTitle
channelButtonTitles
元素中,如下所示:
[channelTitles removeAllObjects];
self.channelTitles = nil;
channelTitles = [[NSMutableArray alloc] init];
...
for (int i=0; i<numberOfTitles; i++) {
// For each mediaItem, get the title and subtitle info
channelButtonTitles *aChannelButtonTitle = [[channelButtonTitles alloc] init]; // create an object to hold the title and miscellaneous data
aChannelButtonTitle.channelTitle = @"some title";
[channelTitles addObject: aChannelButtonTitle]; // add the title
[aChannelButtonTitle release];
}
所以,这是我以前多次使用过的技术,但现在似乎并不开心。弹出视图控制器并返回到根视图控制器时,将调用视图控制器中的dealloc
方法。这会释放channelTitles
,从而导致在dealloc
上存储的channelButtonTitles
辅助类对象上调用channelTitles
。
因为我在我的帮助器类的属性中使用了copy,所以我假设我拥有这个字符串。因此,我正在释放它。如果我从[channelTitle release]
注释掉dealloc
行,则EXC_BAD_ACCESS消失,但我怀疑我现在有内存泄漏。请帮我看看我做错了什么。