문제

내가 코드 내에서 프로젝트는 다음과 같습니다.나를 추가하 보기 컨트롤러해 각각의 세포의 테이블 보기입니다.

배열을,다음과 같이

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 은 주요 배열을 사전&사전 데 ref 보기 컨트롤러입니다.

그래서,어쩌면 다음과 같은 문 후에는 위의 문장은?

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

후 쓰기 위 코드 배열할 수 있는 점이 보기 컨트롤러 또는지?

요약하면,문제는:

  • 무엇이 실제로 사전을 포함하는가?(은 그것을 유지하의 개수를 보기 컨트롤러 또는 단지 참조 볼 컨트롤러)
  • 무엇을 실제로 배열되어 있나요?(은 그것을 유지할 수의 사전 또는 단지 참조를 할 수 있습니다.)
  • 여기에서 내가 원하는 배기 컨트롤러 및 각 보기 컨트롤러에는 서로 다른 값을(나는 그것을 위해 추가 사전에 배열)
도움이 되었습니까?

해결책

전 및 배열에 대한 포인터가 포함되어 있지만,내부의 구현한 클래스는 중요하지 않습니다.무엇을 주의할 필요가 소유권의 개체입니다.

http://boredzo.org/cocoa-intro/, 특히,메모리 관리 섹션에서는 상태:

  • 개체를 만드는 경우와 방법의 선택을 포함 단어"alloc"또는"new",또는 함수의 이름이 포함된 단어 '만들기',그 다음 당신은 그것을 소유하고 있습니다.
  • 만약 당신의 사본을 기존 사용하는 개체 방법의 선택 담 단어의 사본 또는 함수의 이름이 포함된 단어 "Copy"(또는 구체에서 이러 기능),다음은 자신에 복사합니다.
  • 그렇지 않으면,당신은하지 않는 자신의 개체.
  • 는 경우에 당신의 자신의 개체,당신이 할 의무가 있습니다.

귀하의 경우에 당신은 당신을 만드는 사용하는 개체 -alloc, 다,그래서 당신의 자신의 개체에 대한 책임이 있다.그래서 그렇습니다,당신은 필요한 그들을 해제한 후에 추가로 그들을 배열입니다.

NSArrayNSDictionary 유지 자신의 회원,그래서 당신 추가는 개체를 배열하거나 사전에 당신은 안전하게 출시,객체지 않을 할당할 때까지 배열 자체를 제거합체 또는 할당이다.

을 쉽게 자신을 위해 사용할 수 있습니다 편의 생성자를 반환하는 autoreleased 개체:

//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

다른 팁

컬렉션 (예 : 사전 및 배열)에 객체를 추가 할 때 컬렉션은 추가되는 객체를 유지합니다.

컬렉션에있는 한 오브젝트가 살기를 원한다면, 좋은 습관은 컬렉션에 추가하기 전에 객체를 자동 해제하는 것입니다.

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

또는

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

컬렉션에서 객체를 제거하면 컬렉션이 해제됩니다.

즉, 컬렉션이 객체의 유일한 리테이너 인 경우 컬렉션에서 제거 된 후 객체가 처리됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top