2010-03-12 2 views
14

복사 된 NSObject를 릴리스해야하는지 궁금합니다. 예를 들어, 내가 배열에 복사 단 하나의 사전을 만들 :복사 된 NSObject를 릴리스해야합니까? Objective-c

코드 :

for (int num = 0; num < [object count]; num++) { 
    [dictionary setObject:[object objectAtIndex:num] forKey:@"x"]; 
    [array addObject:[dictionary copy]]; 
} 

나는 사전을 해제해야합니까? 그렇다면 언제?

감사

+0

+1 좋은 질문 – andy

+3

엄지 손가락의 규칙처럼 코코아에서 소유하고있는 것을 모두 내 보내야합니다. 새 메시지, 사본, 할당 또는 보관으로 메시지를 보내면 무언가를 소유하게됩니다. 당신이 그 방법들 중 하나를 부르지 않았다면, 당신은 그것을 소유하지 않고 그것을 풀어서는 안됩니다. –

답변

24

예, 당신이. (ID) 복사 -

: 문서에서

NSDictionary *copied = [dictionary copy]; 
[array addObject:copied]; 
[copied release]; 
+0

정보 주셔서 감사합니다! – ncohen

4

이 조각 : 배열이 추가 아무것도 유지하기 때문에이 경우, 당신은 아마 즉시 배열에 추가 한 후 사본을 해제해야

반환 값 NSCopying 프로토콜 방법 copyWithZone :에 의해 반환 된 개체. 영역은 nil입니다.

토론 NSCopying 프로토콜을 채택한 클래스의 편리한 방법입니다. copyWithZone :에 대한 구현이 없으면 예외가 발생합니다.

NSObject 자체가 NSCopying 프로토콜을 지원하지 않습니다. 서브 클래스는 프로토콜을 지원하고 copyWithZone : 메소드를 구현해야합니다. copyWithZone : 메소드의 서브 클래스 버전은 하위 클래스가 NSObject에서 직접 내리지 않는 한 메시지를 슈퍼 우선으로 보내야한다.

특별 고려 사항 가비지 수집이 아닌 관리 메모리를 사용하는 경우이 메서드는 새 개체를 반환하기 전에 유지합니다. 그러나 메소드 호출자는 리턴 된 오브젝트를 해제해야합니다.

2

copy으로 반환 된 개체의 소유권을 가져옵니다. 컨테이너는 또한 추가 된 객체의 소유권을 가져옵니다.
따라서 Noah가 지적한대로 복사본 소유권을 포기해야합니다. Cocoa memory management guidelines에는 how to work with containers이라는 섹션이 있습니다.

0

어쨌든 당신이 사전을 어디서 만들지 않고 말하기가 어렵다. 사전에 다른 멤버가없는 경우, 그것은 것 틀림없이 더 열심히 읽을 수 있지만 :)처럼 뭔가를 (단순

for (int num = 0; num < [object count]; num++) { 
    [array addObject:[NSDictionary 
          dictionaryWithObject:[object objectAtIndex:num] 
             forKey:@"x" 
        ] 
    ] 
} 
오히려 NSMutableDictionary보다, 배열 당신에게 실제있는 NSDictionary 객체를 줄 것

그게 전부 작성중인 사본.

+0

NSMutableDictionary의 복사본이 "* 실제 * NSDictionary"가 아닐 것이라고 주장하는 근거는 무엇입니까? –

+0

* 실제 * NSDictionary가 객체를 삽입하려고하면 오류가 발생합니다. – Jeff

관련 문제