自定义UIView在layoutSubviews中导致EXC_BAD_ACCESS代码= 1

时间:2013-03-12 21:16:26

标签: iphone uiview ios6 exc-bad-access layoutsubviews

我创建了一个自定义UIView,它从UIViewController实例化了3次。从该UIViewController的viewDidLoad方法:

self.remainingDays = [[RemainingTileView alloc] initWithFrame:CGRectMake(20, 49, 80, 75)];
self.remainingHours = [[RemainingTileView alloc] initWithFrame:CGRectMake(120, 49, 80, 75)];
self.remainingMinutes = [[RemainingTileView alloc] initWithFrame:CGRectMake(220, 49, 80, 75)];

[self.view addSubview:self.remainingDays];
[self.view addSubview:self.remainingHours];
[self.view addSubview:self.remainingMinutes];

在RemainingTileView类中,我有这个layoutSubviews方法:

- (void)layoutSubviews {
    [super layoutSubviews];

    if (self.number)    // This is an NSNumber property
        self.numberLabel = [self labelForNumber:[self.number intValue]];
    else
        self.numberLabel = [self labelForNumber:0];

    if (self.unit)    // This is an NSString property
        self.unitLabel = [self labelForUnit:self.unit];
    else
        self.unitLabel = [self labelForUnit:@""];

    [self configView];
}

创建视图时,它会在行if (self.number)上与堆栈帧崩溃:

* thread #1: tid = 0x2403, 0x39f6c526 libobjc.A.dylib`objc_retain + 6, stop reason = EXC_BAD_ACCESS (code=1, address=0x10000010)
frame #0: 0x39f6c526 libobjc.A.dylib`objc_retain + 6
frame #1: 0x000dc742 myProject`-[RemainingTileView layoutSubviews](self=0x1e892b80, _cmd=0x344cde51) + 106 at RemainingTileView.m:63
frame #2: 0x3405d802 UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 258
frame #3: 0x33e07d8a QuartzCore`-[CALayer layoutSublayers] + 214
frame #4: 0x33e07928 QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 460
frame #5: 0x33e0885c QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 16
frame #6: 0x33e08242 QuartzCore`CA::Context::commit_transaction(CA::Transaction*) + 238
frame #7: 0x33e08050 QuartzCore`CA::Transaction::commit() + 316
frame #8: 0x33e07eb0 QuartzCore`CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 60
frame #9: 0x322276cc CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20
frame #10: 0x322259c0 CoreFoundation`__CFRunLoopDoObservers + 276
frame #11: 0x32225d16 CoreFoundation`__CFRunLoopRun + 742
frame #12: 0x32198ebc CoreFoundation`CFRunLoopRunSpecific + 356
frame #13: 0x32198d48 CoreFoundation`CFRunLoopRunInMode + 104
frame #14: 0x35d6f2ea GraphicsServices`GSEventRunModal + 74
frame #15: 0x340ae300 UIKit`UIApplicationMain + 1120
frame #16: 0x000d3448 Project Countdown`main(argc=1, argv=0x2fd2ecf8) + 116 at main.m:17

self.number是NSNumber的一个实例。 UI正在从主线程修改。我在stackoverflow上寻找存在的解决方案,但没有任何效果。

我错过了什么?我应该寻找什么?

2 个答案:

答案 0 :(得分:4)

看起来您的属性声明不正确。可能是assignweak而不是retaincopystrong

答案 1 :(得分:2)

看起来该属性正在返回一些无效对象,ARC正试图保留它,然后失败。看起来你可能最好将你的nil值检查移动到自定义属性访问器中,这类似于:

- (NSNumber *)number {
    if (_number == nil) {
        _number = [NSNumber numberWithInt:0];
    }
    return _number;
}

然后您只需将numberLabel值设置为数字,而无需在此处查看。你也可以为unit做类似的事情。