2012-11-26 3 views
0

에서 "자기"교체는 일반적으로 XIB에서로드 사용자 정의보기 내 코드 보인다.는 ARC

그리고 모두 올바르게 작동합니다. 하지만 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 Simulator)에서만 발생합니다. iOS5 SDK 및 iOS 5 Devices/Simulator에서 모두 정상입니다.

업데이트 됨이 문제는 테이블 뷰 셀에만 적용되며 테이블 뷰 수명주기에서는 할당 취소됩니다. 정적 셀 빌더 (xib에서로드 된 리턴 셀)를 구현하고 내부 셀 초기화를 awakeFromNib로 옮겼습니다. 이제는 모두 제대로 작동합니다.

"이 문제가 있어야하는 이유를 이해하지 못합니다." "자기"는 __strong이고 어떤 객체에 할당하면 자동으로 다시 열 수 없습니다. 나는 틀린가?

+0

loadViewFromXibName ==? – borrrden

+0

그것은 NSBundle 카테고리의 메소드이고, xib에서 View (autoreleased)를로드하고 리턴한다. – Killer

+0

게시 된 코드가 정상입니다. –

답변

-1

나는이 패턴을 사용했지만 ARC 후에는 new을 대신 덮어 쓰려고했습니다. 이 문제가 발생하는 이유는 모르지만 나는 두 가지 중 하나를 추측하고있어 :

  1. ARC 때문에 코코아 init 이름 접두사의 self = [super init...]의 경우에 당신을 위해 제대로 [self release]을 처리합니다. 펜촉 (또는 다른 위치)에서로드 할 경우 동일한 동작을하지 않습니다.
  2. 에서 가져 오지 않는 것을 self에 할당하면 [MyCustomView alloc]으로 할당 한 메모리가 손실됩니다.

나는 그것이 후자라고 생각하는 경향이있다. 펜촉에서로드하는 경우 init이 아니라 new과 같은 팩토리 메서드에서 지정하는 것이 좋습니다.

편집 :이 문제가 iOS 6에 있다고 말했을 때 나는 이전에 가진 것과 같은 문제에 봉착하게 될 것이라고 확신합니다. 내가 이것을 디버깅 할 때 심지어는 중단 점을 dealloc 안에 넣었습니다. init에 전화 할 때마다 한 번 그곳에서 멈추는 것을 볼 수 있습니다.

+0

예, 예상되는 동작입니다. 빈 개체가 릴리스되고 xib에서 새로로드되었습니다. – Killer

+0

"[super init ...]에서 가져 오지 않은 것을 자기에게 할당하면 [MyCustomView alloc]으로 할당 한 메모리가 손실됩니다." 물론 그렇습니다. 그것이 요점입니다. 우리는 원래의 객체를 할당 해제하고 다른 메소드에서 얻은 객체를 유지하려고 시도하고 있습니다. – newacct

-1

사용이 대신 :

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

// 이상적으로 여기 그 배열을 루프 좋을 것이다, 당신의 클래스의 멤버 인보기를 확인하고 그에게 자신을 할당합니다.

입니다.

희망이 도움이됩니다.

건배!

+0

그게 전부입니다 [NSBundle loadViewFromXibName : withClass : owner :]하고 있습니다. – Killer