을 풀어보기 컨트롤러에있는 사전에 목표 C
-
19-09-2019 - |
문제
내가 코드 내에서 프로젝트는 다음과 같습니다.나를 추가하 보기 컨트롤러해 각각의 세포의 테이블 보기입니다.
배열을,다음과 같이
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
, 다,그래서 당신의 자신의 개체에 대한 책임이 있다.그래서 그렇습니다,당신은 필요한 그들을 해제한 후에 추가로 그들을 배열입니다.
NSArray
고 NSDictionary
유지 자신의 회원,그래서 당신 추가는 개체를 배열하거나 사전에 당신은 안전하게 출시,객체지 않을 할당할 때까지 배열 자체를 제거합체 또는 할당이다.
을 쉽게 자신을 위해 사용할 수 있습니다 편의 생성자를 반환하는 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];
컬렉션에서 객체를 제거하면 컬렉션이 해제됩니다.
즉, 컬렉션이 객체의 유일한 리테이너 인 경우 컬렉션에서 제거 된 후 객체가 처리됩니다.