2013-03-12 3 views
0

Я создал пользовательский UIView, который трижды запускается из UIViewController. Из viewDidLoad метод этого UIViewController:Пользовательский UIView вызывает код EXC_BAD_ACCESS = 1 в layoutSubviews

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. Пользовательский интерфейс изменяется от основного потока. Я искал существующие решения здесь в stackoverflow, но ничего не работало.

Что мне не хватает? Что я должен искать?

+1

Как ваши свойства заявлены? –

+0

Вы правы. В предыдущей итерации этого класса self.number был int. Когда я рефакторизовался NSNumber, свойство @ было объявлено как 'assign'. Объявление его «сильным» исправлено. Спасибо. Можете ли вы сделать свой комментарий ответом, чтобы я мог его принять? – invalidArgument

ответ

3

Похоже, что ваши свойства имеют неправильные объявления. Вероятно, assign или weak вместо retain, copy, или strong.

+0

На самом деле, этот сбой происходил из-за плохого управления памятью. И это уже исправлено. Итак, я удаляю комментарий. – Suran

2

Похоже, что свойство возвращает некоторый недопустимый объект, и ARC пытается его сохранить, а затем терпит неудачу. Похоже, что вы могли бы быть лучше двигая чек с нулевыми значениями в пользовательских свойств аксессору, что-то вдоль линий:

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

Тогда вы можете просто установить значение numberLabel на номер без необходимости проверить здесь. Вы можете сделать что-то подобное для unit.

+0

Благодарим вас за ответ. Я проголосовал за ваш ответ, и я применил ваше решение. Вы также указали в правильном направлении, но комментарий Джонатана Гринспена был на месте. – invalidArgument

Смежные вопросы