2013-05-23 2 views
1

나는 UIViewController이고 strongDataController은 항목 목록 (itemsList)을 포함하고 관리합니다. 후자의 초기화 방법에서는 파일에서 항목을 읽고, 웹 서비스 (및 ASIHTTPRequest)를 통해 이들 각각에 대한 추가 정보를 얻은 다음 목록에 항목을 넣은 다음 itemsList 속성에 할당합니다.원치 않는 변수 출시 (iOS)

동기 요청을 사용하면 모든 것이 잘 작동하지만 비동기 구현이 필요합니다. 내가 해냈어 그리고 지금 내 항목이 취소됩니다 (데이터 컨트롤러가 아님). 요청에 대한 델리게이트를 따라 가면 사라집니다. 항목을 계속 유지하려면 어떻게해야합니까? 내 데이터 컨트롤러에서

: 서버 및 초기화 단지 표준 요청이

-(id)initDataController 
{ 
self = [super init]; 
if (self) 
{ 
    NSMutableArray *myList = [[NSMutableArray alloc] init]; 

    // Read items from file ... 

    for (NSString *itemName in items) { 
     MyItem *item = [[MyItem alloc] initWithParam:itemName]; 
     // Here the item has already been deallocated?! 
     if (item) { 
      [myList addObject:item]; 
     } 
    } 
    _itemsList = myList; 
    return self; 
} 
return nil; 
} 

클래스 MyItem에서. 나는 문제가 어떤 것에서 놓쳐 야한다고 생각한다 strong/retain 그러나 나는 그것을 어디에 두어야하는지 전혀 모른다.

편집 :

목록의 정의 :

@property (nonatomic, copy) NSMutableArray *itemsList;

내가 궁금하면 항목 그래서 ... 나는 목록에 넣어 수도 전에 nil 있다는 것입니다 copy 대신에 strong 속성을 만들려고했지만 아무 것도 변경되지 않았습니다.

+1

ivar _itemsList가 질문에 정의 된 방법을 추가하십시오 –

+1

응답 데이터가 초기화를 완료하는 데 필요하면 '초기화'메소드에서 비동기 호출을 할 수 없습니다 ... – Wain

+0

그 중 하나를 잊어 버리십시오. –

답변

1
MyItem *item = ... 

이 로컬 변수는 강력한 참조를 형성합니다. initWithParam:이 객체 (nil이 아님)를 반환하면 목록에 추가되기 전에 할당을 취소 할 수 없습니다 (다른 강력한 참조가 만들어 짐).

재산 선언 결함이 있음을 참고하시기 바랍니다 : 속성이 지정되면, 합성 세터가에 copy를 호출 작성

@property (nonatomic, copy) NSMutableArray *itemsList; 

copy 속성이 변경 가능한 객체 유형과 잘 가지 않습니다 어레이의 복사본 불변의을 복사하여 할당합니다. 이것은 속성의 유형과 모순됩니다.

실제로 유용한 다른 clang 컴파일러에 대한 좋은 기회가 있습니다. 유형이 NSMutableCopying 인 경우 속성을 copy으로 선언 할 수 없습니다. 클랑 팀, 들리는가?

+0

정말 고마워요.답을 읽은 후에, 실제로 init 메소드에서 아무 것도 리턴하지 않는다는 것을 깨달았습니다. 메소드가 나가기 전에 항목이 할당 해제됩니다. 그래서 @Wain은 완벽한 질문에 대한 코멘트에 댓글을 달았습니다. 그러나 배열에 사용할 특성을 알려주시겠습니까? '비 원자력, 강해'? 또는 다른 것? – Antiohia