在ARC下替换“self”

时间:2012-11-26 08:03:28

标签: objective-c ios automatic-ref-counting self

通常我从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,如果我分配任何对象,它就不能自动释放。我错了吗?

2 个答案:

答案 0 :(得分:-1)

我以前做过这种模式但是在ARC之后我试图通过覆盖new来避免它。我不知道为什么这会导致问题,但我猜两件事之一:

  1. 由于Cocoa [self release]命名前缀,ARC在self = [super init...]的情况下正确处理init。如果从nib(或其他地方)加载
  2. ,则不会获得相同的行为
  3. 如果您为self指定了不属于[super init...]的内容,则会丢失您使用[MyCustomView alloc]分配的内存。
  4. 我倾向于认为这是后者。如果您从笔尖加载我建议您使用new等工厂方法,而不是init

    编辑:当你说这个问题出现在iOS 6上时,我很确定你遇到了我之前遇到的同样问题。当我调试这个时,我甚至在dealloc内放了一个断点。每次拨打init时,您都会看到它会停在那里。

答案 1 :(得分:-1)

请改用:

NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"MyCustomClass" owner:nil options:nil];
self = [nibViews objectAtIndex: 0];

//理想情况下,循环遍历该数组会很好,检查哪个视图是您的类的成员并将self指定给它。

在你的init方法中

希望这有帮助。

干杯!