2013-08-21 2 views
1

내 응용 프로그램에서는 NSUserDefaults에 저장하는 데이터의 개체 클래스를 많이 만들었습니다. 뷰 컨트롤러에서개체의 로컬 인스턴스를 편집하면 주 배열의 개체가 변경됩니다.

LauncherEditActionViewController *editActions = [[LauncherEditActionViewController alloc] initWithToDoItem:item]; 
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:editActions]; 
    [self presentViewController:navController animated:YES completion:nil]; 

내가 편집 버전에서 데이터를 표시하는 테이블이 : 그럼 내가이 편집 뷰 컨트롤러에게 전달

LauncherToDoItem *item = [[ActionHelper sharedInstance] actionList][indexPath.row]; 

:

나는하여 아이템을 얻을 항목의

- (id)initWithToDoItem:(LauncherToDoItem *)toDoItem { 
    self=[super initWithStyle:UITableViewStyleGrouped]; 
    if (self) { 
     item = toDoItem; 
     editedToDoItem = toDoItem; 
    } 
    return self; 
} 

나는 그것이 또한 항목을 기록하는 editedToDoItem을 편집, 그래서 그것은 또한 배열의 버전으로 쓰고 같은데요? 왜 그것들 중 하나를 편집하면 그것 모두에 영향을 미치는가? 배열에 다시 저장하지는 않지만 값은 자동으로 저장됩니다.

답변

4

itemeditedToDoItem이 동일한 객체 및 메모리의 동일한 정확한 위치에 모두 있기 때문입니다. item = toDoItem을 작성할 때 실제로 수행하는 작업은 변수 item 안에 toDoItem에 대한 포인터를 저장하는 것입니다. Objective-C 오브젝트 변수는 메모리에있는 오브젝트에 대한 포인터이므로 사본이 아닌 원래 오브젝트에 대한 참조입니다.


다음 코드를 고려하십시오

NSMutableString *string = [@"Hello, world!" mutableCopy]; 
NSMutableString *a = string; 
NSMutableString *b = string; 

// string, a, and b point to the same exact object. 
[string appendString:@" Hi again!"]; 
NSLog(@"%@", a); // => "Hello, world! Hi again!" 
[b appendString:@" Whoa!"]; 
NSLog(@"%@", a); // => "Hello, world! Hi again! Whoa!" 

당신은 당신은 단지 동일한에 대한 참조 주위에 전달하는, 편집 컨트롤러에 두 번 저장 배열에서 항목을 가져 오기 객체는 편집 할 때 메모리의 동일한 위치를 가리 키기 때문에 다른 모든 참조에 반영됩니다.

개체의 여러 복사본을 만들려면 (편집 대상이 다른 개체에 영향을 미치지 않도록) NSCopying Protocol을 따르고 [item copy]을 사용하여 개체를 실제로 복사해야합니다.