2010-03-21 7 views
3

나는이 권리를 얻는 것 같지 않습니다. 변경할 수있는 배열을 반환하는 메서드가 있습니다. 배열을 반환하고 잠재적 인 메모리 누수를 피하는 적절한 방법은 무엇입니까?배열을 반환하는 올바른 방법

결과를 다른보기 컨트롤러에 로컬로 저장하려는 경우 배열 반환 방법에 영향을 줍니까?

마지막으로, 변경 불가능한 배열 인 경우 어떻게해야합니까? 다른 기술이 필요합니까?

덕분에, 내가 사용하는 것 NSMutableArray를 들어 호위

+0

이러한 위대한 답변의 요점은 호출 방법에서 'alloc'을하지 않으면 ' autoreleased해야한다는 것을 의미하는'release '해야합니다. 이 링크를 떠나기를 원했습니다. http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994-BAJHFBGH –

+0

yar : 그건 그렇습니다. 조금 오도 된데, autorelease는 autorelease가 필요하다는 것을 의미하기 때문에 autoreleasing은 release와 실질적으로 동일하다. 당신이 의미했던 것은 셀렉터에'alloc','new','copy'가없는 메소드로 생성 된 객체가 이미 자동으로 릴리즈 되었기 때문에 그냥 반환 할 수 있다는 것입니다. –

+0

@Peter Hosey, 그건 내가 의미하는 바, 당신이 스스로 자동 포기해야한다는 것을 의미하지는 않습니다. 나는 그 호출 된 메서드를 의미 ... 음, 내가 무슨 뜻인지, 당신의 의견을 명확하게 알고있다. : –

답변

4

메소드에 이름에 alloc 또는 copy가없는 경우 올바른 자동 릴리스 버전의 배열을 반환하는 것이 좋습니다. 또한 배열 복사본을 반환하여 로컬 복사본이 수정되지 않도록해야합니다.

- (NSMutabalArray*] mutableArray { 
    return [[myArray mutableCopy] autorelease]; 
} 

- (NSArray*] array { 
    return [[myArray copy] autorelease]; 
} 
+0

감사합니다 - 후속 조치가 사전에도 똑같이 적용됩니까? – Ward

+0

예. 반환되는 카피의 변경이 클래스 내에있는 인스턴스에 영향을 미치지 않게 할 필요가있는 경우는, 일반적으로, 그 클래스의 mutableCopy의 카피를 돌려 줄 필요가있는 컨테이너 클래스에는 true입니다. 메서드 내에서 컨테이너가 반환 전용으로 만들어지는 경우 복사 메커니즘이 필요하지 않으므로이 경우 복사에 대해 걱정할 필요가 없습니다. –

+2

코코아 스타일의 "get"접두사는 참조로 값을 반환하는 메서드를 나타 내기 때문에 (getRed : green : blue : alpha와 같이 NSColor의 getRed 메서드와 같이 getFoo 메서드는 이름을 지정하지 않는 것이 좋습니다. :'는 컴포넌트 값을 넣기를 원하는 CGColor 변수에 네 개의 포인터를 사용합니다. http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html 및 http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/KeyValueCoding을 참조하십시오. /Concepts/AccessorConventions.html. –

1

은 :이 오토 릴리즈되기 때문에

-(NSMutableArray*)getMyArray 
{ 
    NSMutableArray *retval = [[NSMutableArray alloc] init]; 
    // do your stuff w/ array 
    return [retval autorelease]; 
} 

이 코드의 호출은, retain에 반환 된 배열을 할 수 있습니다.

+0

NSMutableArray *가 반환되고 있으므로 배열을 원한다면 반환 된 객체에'copy'를 호출하는 것이 좋습니다. 당신 밑에서 바꿀 수 있습니다. – Abizern

+0

감사합니다 - 내가 반환 된 배열을 유지하거나 그것을 보관하지 않으면 차이점은 무엇입니까? 내가 그걸로 할 의도의 문제 일 뿐이다. 그래서 내가 나중에 그것을 필요로한다면 그것을 유지해야한다. – Ward

+0

일단 호출 메소드가 끝나면 그것을 유지하기를 원한다면 '보유'만하면됩니다. 그렇지 않으면 메소드가 종료 될 때까지'autoreleased' 객체를 가지게됩니다. –

2

자동 해제 개체를 반환합니다. alloc/init/copy 메소드를 사용하여 배열을 만든 경우 배열을 반환하기 전에 autorelease 메시지를 배열에 보내야합니다 (return [myArray autorelease];과 같은 것). 그렇지 않으면 팩토리 메소드 (arrayFrom...arrayWithContentsOf...)로 생성 된 배열은 자동 릴리즈 된 객체를 반환하므로 메모리 누수에 대해 걱정할 필요가 없습니다.

사과 관리 사이트에 대한 정보는 apple dev 사이트에서 확인하십시오. 메모리 누수를 일으키는 반환 된 객체를 유지하는 다른 초기화 메소드가있을 수 있습니다.

관련 문제