正确管理内存以防止解除分配的CFString(不可变)'对象(僵尸)

时间:2015-10-28 18:04:43

标签: ios objective-c memory-management nsstring nszombies

我遇到这种情况,我在一个辅助类的实例中复制了一个字符串,保留了它,然后在分配了辅助类的视图控制器实例的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消失,但我怀疑我现在有内存泄漏。请帮我看看我做错了什么。

0 个答案:

没有答案