0

通常我从 xib 加载自定义视图的代码如下所示:

@implemenation MyCustomView

- (id)init
{
    [self release];

    if ((self = [[NSBundle loadViewFromXibName:@"MyCustomView" withClass:[MyCustomView class] owner:nil] retain]))
    {
        //some init here
    }

    return self;
}

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

4

2 回答 2

-1

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

  1. 由于 Cocoa命名前缀, ARC 会[self release]为您正确处理。如果您从 nib(或其他地方)加载,您将不会得到相同的行为self = [super init...]init
  2. 如果您分配的东西self不是来自[super init...],您将失去分配的内存[MyCustomView alloc]

我倾向于认为是后者。如果您是从 nib 加载,我建议您在工厂方法中执行此操作,例如new,而不是 from init

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

于 2012-11-26T08:34:31.387 回答
-1

改用这个:

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

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

在你的 init 方法中。

希望这可以帮助。

干杯!

于 2012-11-26T08:37:18.133 回答