0

在我的类 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];在我的交易中?应用程序崩溃并显示消息:“* [UISearchBar respondsToSelector:]: message sent to deallocated instance * ”。

4

2 回答 2

1

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

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

于 2012-10-01T10:03:53.667 回答
0

您需要了解对象所有权规则。在手动保留和释放环境(相对于 ARC)中,Objective-C 对象的规则可以用首字母缩写词NARC来记住。

如果您引用了使用newalloc创建的新对象,或者您调用了retain的任何对象,或者您通过调用另一个对象上的copymutableCopy创建的任何对象,或者由任何以 any 开头的方法创建的任何对象在这些名称中(例如newInstance),那么 您拥有该对象,并且在您被释放之前您必须释放它。

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

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

于 2012-10-01T10:17:59.140 回答