2012-09-23 2 views
3

NSJSONSerialization 클래스의 사전을 생성하는 메소드가 있습니다. 그런 다음 json을 열거하고 각 인스턴스에 대해 상태를 저장하는 객체를 만듭니다.루프에서 객체 생성하기 상태를 유지하지 않는 ivar/인스턴스 변수

- (void)fetchedData:(NSData *)responseData { 

    NSError* error; 
    NSDictionary *json = [NSJSONSerialization 
          JSONObjectWithData:responseData 
          options:kNilOptions 
          error:&error]; 

    NSArray *moviesJson = [json objectForKey:@"movies"]; 

    for(NSDictionary *element in moviesJson) 
    { 
     RABMovie *myMovie = [[RABMovie alloc] initWithJson:element]; 
     // RABMovie *myMovie = [RABMovie new]; 
     // myMovie.json = element; 

     [_myMovieNames addObject: myMovie]; 
     myMovie = nil; 

    } 

    [self.movieTableView reloadData]; 
} 

문제 :이 작업을 수행 할 때이 할당 자에 element를 전달하여 내 객체를 생성 할 그러나, 내 UITTableView 행 모두가 같은 동영상 데이터가 포함되어 있습니다. 항상 마지막 항목 인입니다. 제가 단 하나의 메모리 주소로 작업하고 있다고 믿게하고, 마지막 업데이트가 전체 컬렉션에 영향을 미칩니다.

alloc 매개 변수 대신 json을 속성으로 사용하는 코드의 주석을 제거하면 더 이상 문제가 발생하지 않으며 모든 것이 잘 작동합니다. 또한 element의 딥 복사본을 통해 완전히 새로운 NSDictionary을 만들려고 시도했습니다.

누군가 이런 일이 일어나는 이유를 알고 있습니까? BTW, 나는 ARC를 사용하고있다. 시간 내 주셔서 감사합니다.

편집 : 추가 코드가 추가되었습니다. 저는 movieName 속성을 사용하여 ivar 사용 방법을 설명했습니다 _json.

@implementation RABMovie 

NSDictionary *_json; 
- (id) initWithJson: (NSDictionary*) jsonAsDictionary 
{ 
    if (self = [super init]) 
    { 

     _json = jsonAsDictionary; 
    } 

    return self; 
} 

- (NSString*) movieName 
{ 
    return [_json objectForKey:@"title"]; 
} 
+4

RABMovie 초기화 프로그램 (initWithJson)의 코드를 게시 할 수 있습니까? – aleroot

+0

예, 더 많은 코드를 게시해야합니다. 게시 한 코드에 아무런 문제가 없습니다. 작동해야합니다 (moviesJson에 생각하는 내용이 포함되어 있다고 가정하면 for 루프에 요소를 기록해야합니다). – rdelmar

답변

4

_json을 인스턴스 변수로 선언해야한다고 생각합니다. 대신 스코프 규칙에서 100 % 확신 할 수는 없지만 인스턴스 변수가 아니어도 모든 인스턴스에서 공유하는 단일 변수입니다. 대신을 시도해보십시오 @implementation 지시자 후 괄호 안에 퍼팅

@implementation RABMovie { 
    NSDictionary *_json; 
} 

/* ...rest of class */ 

@end 

는 인스턴스 변수 있습니다. 희망이 도움이!

편집 : RABMovie에 이미 json이라는 속성이 있습니까? 그런 다음 인스턴스 선언을 건너 뛰면 컴파일러에서 인스턴스 변수를 생성합니다. 아마 실제로 벌어지고있는 것입니다. 이것이 당신이 부동산을 다닐 때 작동하는 이유입니다. 그것은 "글로벌"보다는 ivar에 액세스하는 것입니다.

+0

젠장, 나는 아이작처럼 _json을 갖고 싶지만 중괄호는 잊어 버렸다. 그것은 그 문제를 해결했습니다. 지금은 글로벌 범위가 있다면 마지막으로 설정된 값만 유지할 것입니다. 따라서 왜 내 테이블 뷰 행에 동일한 데이터가 모두 있는지. 감사! –

+0

여러분을 환영합니다! –

관련 문제