通常我从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:]
- 返回atreleased View,从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设备/模拟器上一切都很好。
更新此问题仅出现在表格视图单元格中,并在tableview生命周期中取消分配。我实现了静态单元构建器(从xib加载的返回单元格)并将内部单元初始化移动到awakeFromNib。现在一切正常。
我不明白为什么这个问题应该是 - “自我”是__strong,如果我分配任何对象,它就不能自动释放。我错了吗?
答案 0 :(得分:-1)
我以前做过这种模式但是在ARC之后我试图通过覆盖new
来避免它。我不知道为什么这会导致问题,但我猜两件事之一:
[self release]
命名前缀,ARC在self = [super init...]
的情况下正确处理init
。如果从nib(或其他地方)加载self
指定了不属于[super init...]
的内容,则会丢失您使用[MyCustomView alloc]
分配的内存。我倾向于认为这是后者。如果您从笔尖加载我建议您使用new
等工厂方法,而不是init
。
编辑:当你说这个问题出现在iOS 6上时,我很确定你遇到了我之前遇到的同样问题。当我调试这个时,我甚至在dealloc
内放了一个断点。每次拨打init
时,您都会看到它会停在那里。
答案 1 :(得分:-1)
请改用:
NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"MyCustomClass" owner:nil options:nil];
self = [nibViews objectAtIndex: 0];
//理想情况下,循环遍历该数组会很好,检查哪个视图是您的类的成员并将self指定给它。
在你的init方法中。
希望这有帮助。
干杯!