2010-04-26 4 views
6

100 개의 Foo 객체를 나열하는 tableview 클래스가 있다고 가정 해 보겠습니다. 그 안에 모든 객체도 유지됩니다 의미는있는 NSMutableArray가 유지로 표시되어 있으므로 :Objective-C/Cocoa에서 여러 객체가 같은 객체를 유지할 수 있습니까?

 
@property (nonatomic, retain) NSMutableArray* fooList; 

을하고 내가 좋아하는, FOOS 그것을 채우기 : 그것은이

 
self.fooList = [NSMutableArray array]; 
while (something) { 
    Foo* foo = [[Foo alloc] init]; 
    [fooList addObject:foo]; 
    [foo release]; 
} 

첫 번째 질문? 배열에 추가 된 후 foo를 올바르게 추가하고 로컬 복사본을 릴리스 했습니까? 아니면 전화를받지 않습니까? 그런 다음

사용자가 테이블에있는 하나 개의 특정 행을 선택하고 내가 전화를 상세 푸보기를 표시하려면 : BOTH 지금

 
@property (nonatomic, retain) Foo* theFoo; 

을 너무 :

 
FooView* localView = [[FooView alloc] initWithFoo:[self.fooList objectAtIndex:indexPath.row]]; 
[self.navigationController pushViewController:localView animated:YES]; 
[localView release]; 

이제 FooView 클래스가를 배열은 그 FooView뿐만 아니라 그 FooView를 잡고 있습니다. 하지만 괜찮아 보이니? 사용자가 뒤로 버튼을 누를 때 dealloc은 FooView에서 호출되고 [theFoo release]가 호출됩니다. 그런 다음 다른 뒤로 버튼이 눌려지고 dealloc이 tableview 클래스에서 호출되고 [fooList release]가 호출됩니다.

당신은 FooView 클래스가 있어야한다고 주장 있습니다

 
@property (nonatomic, assign) Foo* theFoo; 

대 유지한다. 그러나 때때로 FooView 클래스는 배열에도없는 Foo와 함께 호출됩니다. 그래서 두 개의 객체를 같은 다른 객체에 고정시키는 것이 괜찮은지 확인하고자했습니다.

답변

4

다른 사람들이 말하는 것처럼, 당신이하고있는 일은 정확하며 코드는 내게 맞습니다. 내 코드에서 동일한 객체에 대한 수십 개의 참조가 있으며 모든 보유 및 릴리스의 균형을 유지하는 한 모든 것이 올바르게 작동합니다.

조금 더 자세하게 추가하려면 ...

NSMutableArray가 retain으로 표시되어 있기 때문에 그 안에있는 모든 객체도 유지된다는 의미입니까?

이것은 두 가지입니다. 모든 컬렉션 클래스 (사전, 배열, 집합)는 컬렉션 객체를 할당 해제 할 때 자동으로 추가하고 컬렉션 객체를 해제합니다. (NSMutableArray의 경우 배열에서 개별적으로 제거하거나 배열 전체를 할당 해제하면 내용 객체가 해제됩니다.)

이것은 컬렉션 객체 자체가 유지되는지 또는 객체로 할당되는지 여부와 관련이 없습니다. 재산. 고려해야 할 유일한 사항은 컬렉션 객체 속성에 대한 정책이 올바르지 않으면 조만간에 발표 될 수 있으며 상황이 균형을 잃을 수 있다는 것입니다.

다른 사람들이 말하는대로 ... memory management guide을 읽고 연습하십시오. :) 오, 이런 관점에서 다른 사람의 코드도 읽고 어떻게/왜 그들이 메모리 관리를하는지 이해하려고 노력하십시오.

다른 작은 것들 ... 모든 유지 된 속성에 대해 객체의 dealloc 메소드에서 해제 호출이 있어야합니다.

+0

Typo : "... 컬렉션 개체가 해제 될 때 해당 콘텐츠 개체를 해제하십시오." 콜렉션의 오브젝트는 콜렉션이 * deallocated * 될 때까지 해제되지 않습니다. – JeremyP

+0

고마워요. 당신이 "release"함으로써 "retain count가 dealloc을 트리거하는 0이되는 마지막 릴리즈"를 의미한다고 주장 할 수도 있지만, 단지 dealloc이 그 맥락에서 더 명확하다는 것을 말합니다. – Jaanus

4

예, 괜찮습니다. 그것이 참조 계산 메모리 관리 시스템의 전체 지점입니다.

5

주요 질문에 대답하려면 예를 들어 여러 개체를 유지할 수 있습니다. 이것이 바로 참조 카운트 된 메모리 관리의 요점입니다. 자세한 정보는 코코아 Memory Management Programming Guide을보십시오. 그런 다음 다시 읽으십시오. 그것은 모든 답변을 가지고 가장 친한 친구가 될 것입니다.

는 기본적으로 -retain 메시지를 보내는 송신자가 모든 소유자가 자신의 소유권을 발표했다 때까지 수신기가 해제되어서는 안된다는 의미에서 수신기를 "소유"을 나타냅니다. 따라서 개별 인스턴스는 다른 소유자가 있는지 여부를 알 필요도 없습니다. 작업을 마친 후에는 보관하고 놓아 둘 필요가있는 것을 보관하십시오. 모든 소유자가 소유권을 해제하면 의도를 해제 할 수 있습니다. 보조 노트에

,

@property (retain,readwrite) NSMutableArray *myArray; 

이 속성을 선언하는 클래스가 NSMutableArray 인스턴스를 유지합니다 함을 선언합니다. NSArray, NSDictionaryNSSet (변경 가능한 하위 클래스)은 항상 내용을 유지합니다.

관련 문제