NSMutable Array의 적절한 분리

3191 단어
아이폰 프로그램 개발 중의 메모리 유출 문제는 초보자들이 매우 골치 아픈 일이다. C#와 같은 자동 쓰레기 방출 언어가 너무 습관이 되었는지 xcode의 프로필 도구로 내가 쓴 프로그램을 찾아봤는데 메모리가 많이 유출되었다. 한동안의 조사를 통해 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 방법에도 적용됩니다.

좋은 웹페이지 즐겨찾기