【发布时间】:2012-11-26 08:03:27
【问题描述】:
通常我从 xib 加载自定义视图的代码如下所示:
@implemenation MyCustomView
- (id)init
{
[self release];
if ((self = [[NSBundle loadViewFromXibName:@"MyCustomView" withClass:[MyCustomView class] owner:nil] retain]))
{
//some init here
}
return self;
}
其中[NSBundle loadViewFromXibName:withClass:owner:] - 返回atoreleased 视图,从xib 加载。
一切正常。 但是当我尝试在 ARC 等效代码下编写时:
@implemenation MyCustomView
- (id)init
{
if ((self = [NSBundle loadViewFromXibName:@"MyCustomView" withClass:[MyCustomView class] owner:nil]))
{
//some init here
}
return self;
}
我的应用程序因 EX_BAD_ACCESS 崩溃(释放消息发送到已释放的实例) 在这种情况下会发生什么?我该如何解决这个问题?
已更新 此问题仅在 iOS6 SDK(iOS6 模拟器)上出现。在 iOS5 SDK 和 iOS 5 设备/模拟器上一切正常。
更新这个问题只出现在表格视图单元格中,它在表格视图生命周期中被释放。我实现了静态单元生成器(从 xib 加载的返回单元)并将内部单元初始化移动到 awakeFromNib。现在一切正常。
我不明白为什么会出现这个问题——“self”是__strong,如果我给它分配任何对象,它就不能被自动释放。我记错了吗?
【问题讨论】:
-
loadViewFromXibName == ?
-
这是一个来自 NSBundle 类别的方法,从 xib 加载并返回 View (autoreleased)。
-
贴出来的代码没问题。
-
传统上,你会像这样初始化
self:self = [super init],它不会返回一个自动释放的对象。在这里,您将 self 作为一个自动释放的对象返回,这不应该发生在init方法中。[[Class alloc] init]应该返回一个保留对象,这是 ARC 尊重的(我认为是七个)规则之一。 -
是的,我想是的。但在 ARC 之下,我可以保留这个对象。 ARC 的解决方法在哪里?
标签: objective-c ios automatic-ref-counting self