NSMutable Array의 적절한 분리
NSMutable Array how to properly addObjects and release라는 토론 주제에서 NSMutable Array를 정확하게 사용하는 절차를 제시하고 그가 제시한 코드를 먼저 본다.
NSMutableArray *listData = [[NSMutableArray alloc] init];
for (int i = 0; i < 3; i++) {
MyData *obj = [[MyData alloc] init];
NSString *name = nil;
switch (i) {
case 0:
name = @"Semen";
break;
case 1:
name = @"Ivan";
break;
case 2:
name = @"Stepan";
break;
default:
break;
}
obj.name = name;
[listData addObject: obj];
[obj release];
}
[listData release];
안에 세 가지 문제가 언급되었는데 번역한 후에 나의 이해를 더했다.
(1) NSMutableArray 배열에 포함된 객체는 무엇입니까?대상의 복사본인데, 아직 대상의 지침일 뿐입니까?
답: 수조에 저장된 것은 대상의 복사본이 아니라 대상의 지침일 뿐이다.
이전에 배운 C++의 사고방식에 따르면 위의 [obj release]가 가장 이해하기 어렵다. 나는 obj를 수조에 넣었는데 수조에 저장된 것은 대상의 인용이다. 왜 obj를 풀어주었을까?이렇게 수조에 잘못된 바늘을 저장했습니까?실제로는 사고방식이 바뀌지 않았다. Objective-C에서 [obj release]는 obj가release 메시지를 받았다는 뜻일 뿐이다. 인용 계수가 0이 되지 않으면 풀리지 않고 C++에서 이release를 보면 풀릴 생각을 하게 된다.프로세스를 살펴보겠습니다.
MyData *obj = [[MyData alloc] init];//obj는 init 방법을 사용했습니다. 약속에 따라obj의 인용 계수는 1이고 방출 과정을 스스로 유지해야 합니다.
[listData addObject: obj];//obj는 수조에 넣을 때 자동으로 obj의 인용계수에 1을 추가하는데 이때 obj의 인용계수는 2이다
[obj release];//obj의 정상적인 계수값을 유지하기 위해 이 문장으로 obj의 인용계수를 1로 합니다. 단지 이것뿐입니다. 풀리지 않았습니다!
[listData release];//이 문장은obj에release 메시지를 다시 보내면obj의 인용 계수가 0이 되어 삭제됩니다.만약 앞의 문장 [obj release]을 쓰지 않으면obj의 대상이 정상적으로 방출되지 않으면 메모리 유출을 초래할 수 있습니다!
(2) 배열의 모든 객체를 제거한 다음 NSMutable Array 객체를 해제해야 합니까?
답:필요 없어요.
NSMutable Array 대상을 방출하면, 자동으로 안에 있는 대상에게release 메시지를 보냅니다.
(3) NSMutableArray를 올바르게 사용하려면 어떻게 해야 합니까?(alloc, init, work, release)
대답:
1. NSMutableArray *arr = [[NSMutableArray alloc] init];//분배 그룹
2. alloc object1.//분배
3. add object1 to array.//obj1을 그룹에 추가하기
4. release object1.//obj1 인용 계수 감소 1
5. alloc object2.//분배
6. add object2 to array.//obj2를 그룹에 추가하기
7. release object2.//obj2 인용 계수 감소 1
8. add as many objects as needed in this manner.//위의 방법에 따라 임의로 많은 대상을 추가할 수 있다
8. work with object1.//안에 있는 대상을 방문할 수 있습니다.
9. remove object1 from array. it will receive a release automatically.//obj1을 제거할 수도 있습니다. 이때obj1은release 메시지를 자동으로 받습니다.
10. [arr release];//object2 and others will receive a release. 마지막으로 그룹을 방출하면, 그룹의 모든 요소도release 메시지를 자동으로 받을 수 있습니다
이러한 규칙은 NSMutable Dictionary 클래스의 setObject 방법에도 적용됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.