繁体   English   中英

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

[英]Do I need to send release to my instance variable in the dealloc method? (iOS)

在我的类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版本]; 在我的dealloc中? 应用程序崩溃,并显示以下消息:“ * [UISearchBar responsesToSelector:]:发送到已释放实例*的消息

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

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

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

如果您有您在使用新的页头 ,或者说你叫保留上的任何对象,或者您可以通过调用另一个副本mutableCopy创建的任何对象,或与任何启动的任何方法创建的任何对象创建新的对象引用这些名称中的一个(例如newInstance ),则您拥有该对象,并且在释放之前, 必须释放它。

但是,如果您没有执行任何这些操作,那么您就不会拥有该对象 ,也不能释放它。 资源

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM