2009-06-26 3 views
1

나는 극도로 짜증나는 문제에 봉착했습니다. 나는 초기화 메소드에서 JSON 또는 plist 파일 (나는 둘 다 시도했다)에서 사전을 디코딩 한 다음 해당 사전에서 배열을 검색하는 UITableViewController가있다. 나중에 tableView : numberOfRowsInSection : 메서드에서 해당 배열의 개수를 반환합니다.plist 또는 JSON에서 디코딩 된 배열이 다음에 응답하지 않는 이유는 무엇입니까? 프로그래밍 방식으로 생성 된 배열에서 class 또는 : count가 응답하지 않는 이유는 무엇입니까?

그러나 나를 초월한 이유 때문에, 그 지점에서 배열에 대해 count를 호출하면 응용 프로그램이 충돌하지만 init에서 할당 한 후 직접 호출하는 것은 아닙니다. 또한 NSArray initWithObjects 통해 프로그래밍 방식으로 만든 배열로 초기 할당을 바꿀 경우 잘 작동합니다. INIT에서

JSON 디코딩 :

NSString *jsonPath = [[NSBundle mainBundle] pathForResource:@"Categories" ofType:@"json"]; 
SBJSON *jsonParser = [SBJSON new]; 
NSDictionary* dict = [jsonParser objectWithString:[NSString stringWithContentsOfFile:jsonPath encoding:NSUTF8StringEncoding error:nil]]; 
categories = [dict objectForKey:@"ContentCategories"]; 

// Outputs correct count 
NSLog(@"Count: %@", [NSNumber numberWithInt:[categories count]]); 

프로그래밍 INIT :

categories = [[NSArray alloc] initWithObjects: [[NSDictionary alloc] initWithObjectsAndKeys:@"Junk", @"Title"]]; 

// Outputs correct count 
NSLog(@"Count: %@", [NSNumber numberWithInt:[categories count]]); 

있는 UITableViewController 행 방법의 수 : I가 아니라 "카테고리"변수를 시도한

// Outputs correctly if programmatically created, crashes if decoded from JSON/plist 
NSLog(@"Count: %@", [NSNumber numberWithInt:[categories count]]); 

ivar, 재산 - ivar, 그리고 클래스 변수로, 행운을합니다.

도움 주셔서 감사합니다.

답변

0

참고 : '카테고리'를 속성으로 변경하고 '자체'를 추가하십시오. 모든 설정/가져 오기 방법 (예 : self.categories = ...) 앞에서이 작업이 이루어졌습니다. 어떤 이유로 "카테고리"를 호출하면 numberOfRows 메소드 (!)에 UIWindow 유형의 객체가 반환됩니다. 그것은 나에게 매우 이상하게 보입니다. (컴파일 에러를 만나기를 바랄 것입니다.)하지만 다시, obj-c에 대해 비교적 새로운 것 같습니다.

2

JSON 구문 분석기에 익숙하지 않지만 코코아 규칙을 따르는 경우 objectWithString은 자동 변환 된 객체를 반환합니다. 즉, 보유하고 있지 않으면 runloop을 통해 다음 반복에서 할당 해제됩니다. Cocoa 컬렉션 클래스는 할당을 해제하면 포함 된 각 객체를 해제하므로 범주도 해제됩니다. 이것이 처음에는 작동하지만 나중에는 작동하지 않습니다.

그것이 속성으로 사용되는 이유는 만든 합성 된 setter가 범주를 유지한다는 것입니다 (사용자가 가정 한 retain 매개 변수로 속성을 설정한다고 가정 할 때). 따라서 릴리스되지 않습니다. 그것은 적절한 해결책입니다, 좋은 작품입니다. :) 카테고리에 보유를 호출하면 효과가있었습니다.

메서드 이름에 "alloc"또는 "copy"가 포함되거나 "new"로 시작되는 경우 반환되는 개체의 보유 횟수는 1이고 사용자는이를 해제해야합니다. 그렇지 않으면 반환 된 객체의 보유 횟수가 0 (자동 반복 실행 됨)이며, 보유하지 않는 한 실행 루프를 통해 다음 반복에서 할당 취소됩니다 (이 경우 나중에 해제 할 책임이 있습니다).

나는이 글을 읽는 것이 좋습니다 Memory Management Programming Guide for Cocoa

편집 : 그 방법은 "ALLOC"를 포함하고 있기 때문에 은 사용 일 이유 [[NSArray를의 ALLOC]이 initWithObjects ...], 반환 된 배열은 오토 릴리즈되지 않은됩니다 , 나중에 액세스 할 때 여전히 주위에 있습니다.

관련 문제