2013-03-12 2 views
0

UIViewController에서 3 번 인스턴스화 된 사용자 정의 UIView를 만들었습니다. 그 UIViewController에의 viewDidLoad 방법에서 : 뷰를 만들 때사용자 정의 UIView는 layoutSubviews에서 EXC_BAD_ACCESS 코드 = 1을 발생시킵니다.

- (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)에 충돌 :

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 방법이

* 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에 존재하는 솔루션을 찾았지만 아무 것도 효과가 없었다.

무엇이 누락 되었습니까? 내가 뭘 찾아야하니?

+1

속성은 어떻게 선언됩니까? –

+0

당신 말이 맞아요. 이 클래스의 이전 반복에서 self.number는 int였습니다. 내가 NSNumber에 리팩터링 할 때,'@ property'는'assign'으로 선언 된 상태로 남았습니다. 그것을 '강하게'한다고 선언하면 그것을 고쳤습니다. 고맙습니다. 답변을 수락 할 수 있도록 답글을 달 수 있습니까? – invalidArgument

답변

3

속성에 잘못된 선언이있는 것 같습니다. 아마도 assign 또는 retain, copy 또는 strong 대신에 weak 일 것입니다.

+0

실제로 메모리 관리가 좋지 않아 충돌이 발생했습니다. 그리고 그것은 이미 고쳐졌습니다. 따라서 댓글을 삭제합니다. – Suran

2

속성이 잘못된 개체를 반환하고 ARC가이 개체를 유지하려고 시도하는 것으로 보이는데 실패한 것으로 보입니다. 그것은 당신이 더 나을, 사용자 정의 속성 접근로의 라인을 따라 뭔가를 전무 값에 대한 수표를 이동 할 수 다음과 같습니다

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

그럼 당신은 단순히 여기에서 확인하지 않고도 번호로 numberLabel 값을 설정할 수 있습니다. unit과 비슷한 것을 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 나는 당신의 답을 뽑았고 당신의 해결책을 적용했습니다. 당신은 또한 올바른 방향을 지적했지만, @Jonathan Grynspan의 의견에 대한 언급이있었습니다. – invalidArgument