【问题标题】:Do I need to send release to my instance variable in the dealloc method? (iOS)我是否需要在 dealloc 方法中将释放发送到我的实例变量? (iOS)
【发布时间】:2012-10-01 19:51:37
【问题描述】:

在我的类 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 *”。

【问题讨论】:

    标签: iphone objective-c ios memory-management


    【解决方案1】:

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

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

    【讨论】:

    • 如果一个对象在没有自动释放的情况下使用它会发生什么?
    • 那么,当然,对象的接收者(使用代码返回值的函数/对象)在使用后负责释放它。我有点误读了你的代码:你发布了searchField,但你没有展示你是如何创建它的。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • [UISearchBar respondsToSelector:]:消息发送到解除分配的实例
    猜你喜欢
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2011-09-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    相关资源
    最近更新 更多