0

다음 문제에 대해 약간 혼란 스러웠습니다.사전에있는보기 컨트롤러 - 객관적인 c에 있음

다음과 같이 프로젝트에 코딩이 있습니다.

저는 테이블 뷰의 각 셀에 뷰 컨트롤러의 뷰를 추가하고 있습니다. ... 나 방법을 설명 지금이

NSMutableArray *arrTbl=[[NSMutableArray alloc] init]; 
NSMutableDictionary *dOne=[[NSMutableDictionary alloc] init]; 
myViewController *objVCtr=[[myViewController alloc] initWithNibName:@"myViewController" bundle:nil]; 
[dOne setValue:objVCtr forKey:@"cellVCtr"]; 

NSMutableDictionary *dTwo=[[NSMutableDictionary alloc] init]; 
myViewController *objVCtr1=[[myViewController alloc] initWithNibName:@"myViewController" bundle:nil]; 
[dOne setValue:objVCtr1 forKey:@"cellVCtr"]; 

NSMutableDictionary *dThree=[[NSMutableDictionary alloc] init]; 
myViewController *objVCtr2=[[myViewController alloc] initWithNibName:@"myViewController" bundle:nil]; 
[dOne setValue:objVCtr2 forKey:@"cellVCtr"]; 

[arrTbl addObjectsFromArray:[NSArray arrayWithObjects:dOne,dTwo,dThree,nil]]; 

같은

배열을하자, 질문은, 어떻게이 해제됩니다 ???

arrTbl은 사전 컨트롤러가있는 & 사전이있는 주 어레이입니다.

그래서 위의 진술 뒤에 다음 문을 써야합니까?

[dOne release]; 
[dTwo release]; 
[dThree release]; 
[objVCtr release]; 
[objVCtr1 release]; 
[objVCtr2 release]; 

위의 코드를 작성한 후에 배열은 뷰 컨트롤러를 가리킬 수 있는지 여부를 결정할 수 있습니까?

확인. 다시 말해 보죠?

문제는

  • 실제로 무엇을 포함하는 사전 않습니다입니까? (View 컨트롤러의 수 또는 뷰 컨트롤러의 참조 만 보유하고 있습니까?)
  • 실제로 배열에는 무엇이 들어 있습니까? 난 그냥보기 컨트롤러 &
(I 배열에 사전을 추가하고 그것에 대해) 다른 값으로 각 뷰 컨트롤러의 배열을 갖고 싶어 여기
  • 을 (그것은? 사전이나 사전의 단지 참조 카운트를 유지 IS)

    미리 지식을 공유해 주셔서 감사합니다.

    개체를 유지할 것이다 수집 첨가되는

  • 답변

    1

    사전 및 배열에는 개체에 대한 포인터가 있지만 이러한 클래스의 내부 구현은 중요하지 않습니다. 주의해야 할 것은 물건의 소유권입니다.

    특히 메모리 관리 부분은 어떤 상태, http://boredzo.org/cocoa-intro/에서보세요 :

    • 당신이 선택기 단어 "ALLOC"또는 "새"를 포함하는 방법으로 객체를 생성하는 경우, 또는 함수에 이름이 " "이라는 단어가 포함되어 있으면 해당 단어를 소유하고있는 것입니다.
    • 당신은 선택 "복사", 또는 이름 함수에서이 단어를 포함하는 방법을 사용하여 기존 객체의 복사본 단어 "복사"를 포함 할 (또는 함수에서 오브젝트를 취득)하는 경우 , 그 때 당신은 사본을 소유하고 있습니다.
    • 그렇지 않으면 개체를 소유하지 않은 것입니다.
    • 개체를 소유하고 있다면 개체를 공개해야합니다. 귀하의 경우에는

    당신은 당신이 개체를 소유하고 그들에 대한 책임이 있습니다, 그래서 -alloc를 사용하여 객체를 만들 수 있습니다. 예, 배열에 추가 한 후 해제해야합니다.

    NSArrayNSDictionary은 멤버를 유지하므로 안전하게 배열이나 사전에 객체를 추가하면 객체 자체가 객체를 제거하거나 할당이 해제 될 때까지 객체가 할당 해제되지 않습니다.

    //note the autorelease when the view controllers are created 
    MyViewController* viewController = [[[MyViewController alloc] initWithNibName:@"myViewController" bundle:nil] autorelease]; 
    NSDictionary *dOne = [NSDictionary dictionaryWithObject:viewController forKey:@"cellVCtr"]; 
    
    
    MyViewController *objVCtr1 = [[[MyViewController alloc] initWithNibName:@"myViewController" bundle:nil] autorelease]; 
    NSDictionary* dTwo = [NSDictionary dictionaryWithObject:objVCtr1 forKey:@"cellVCtr"]; 
    
    MyViewController *objVCtr2 = [[MyViewController alloc] initWithNibName:@"myViewController" bundle:nil]; 
    NSDictionary* dThree = [NSDictionary dictionaryWithObject:objVCtr2 forKey:@"cellVCtr"]; 
    
    NSArray* arrTbl = [NSArray arrayWithObjects:dOne, dTwo, dThree, nil]; 
    
    //do something with arrTbl 
    //make sure you retain it if you want to hang on to it 
    
    :

    는 오토 릴리즈 개체를 반환 편의 생성자를 사용할 수 있습니다, 자신을 위해 쉽게 만들려면

    1

    (예 : 사전과 같은 배열) 콜렉션에 객체를 추가 사가르.

    개체가 컬렉션에있는 동안 만 살아 있도록하려면 개체를 컬렉션에 추가하기 전에 개체를 자동으로 해제하거나 개체를 컬렉션에 추가 한 직후에 개체를 명시 적으로 해제하는 것이 좋습니다. 그래서 같은 :

    MyObject *anObject = [[[MyObject alloc] init] autorelease]; 
    [aDictionary setObject:anObject forKey:@"aKey"]; 
    

    또는

    MyObject *anObject = [[MyObject alloc] init]; 
    [aDictionary setObject:anObject forKey:@"aKey"]; 
    [anObject release]; 
    

    개체가 컬렉션에서 제거 될 때, 컬렉션을 출시 할 예정 기억

    .

    즉, 컬렉션이 개체의 유일한 보유자 인 경우 개체는 컬렉션에서 제거 된 후에 할당 취소됩니다.