我是否需要在dealloc方法中将release发送到我的实例变量? (IOS)

时间:2012-10-01 09:54:09

标签: iphone objective-c ios memory-management

在我的班级dealloc方法中我有

- (void) dealloc
{
    [searchField release]; 
    [super dealloc];
}

其中searchField在类变量中定义。

@interface SearchCell : UITableViewCell
{
    UISearchBar *searchField;
    id delegate;
}

该类的使用方式如下:

if (indexPath.section == 0)
    {
        SearchCell *mycell = [[SearchCell alloc] init];
        [cell setDelegate:self];
        return [mycell autorelease];
    }

在这里创建了searchField:

- (id) init
{
    self = [super initWithFrame:CGRectZero];

    [self create];

    return self;
}

- (void) create
{
    searchField = [[UISearchBar alloc] initWithFrame:CGRectZero];
    searchField.autocorrectionType = UITextAutocorrectionTypeNo;    
    [self addSubview:searchField];
}

我需要使用[searchField release];在我的dealloc?应用程序崩溃并显示消息:“* [UISearchBar respondsToSelector:]:发送到解除分配的实例的消息* ”。

2 个答案:

答案 0 :(得分:1)

不,不要在那里发布。由于您使用“autorelease”返回它,下一次运行事件循环将自动减少保留计数。

当你最终点击“dealloc”方法时,保留计数已经为0,你的应用程序将引发异常。

答案 1 :(得分:0)

您需要了解对象所有权规则。在手动保留&发布环境(与ARC相反)可以用首字母缩写词 NARC 来记住Objective-C对象的规则。

如果您使用 alloc 或您调用保留的任何对象,引用了您新创建的对象,或者您通过在另一个或任何以任何这些名称开头的方法创建的任何对象(例如newInstance)上调用复制 mutableCopy 创建的任何对象,然后 您拥有该对象,在您取消分配之前,必须释放它。

但是,如果您没有做任何这些事情,那么不拥有该对象不得释放它。 source

在您的情况下 - 您没有显示设置值searchField的代码,但是从崩溃中我想象您永远不会拥有该对象的所有权。显示您分配给searchField的代码,我们都知道。 编辑:您通过alloc创建所有权来获取所有权。您需要将release保留在dealloc中。它是从其他地方发布的吗?或者细胞本身是否可能过度释放?