2011-08-01 2 views
0

나는이 같은 방법을 가지고 우리가 가정 해 봅시다 :리턴 값인 NSDictionary (또는 다른 NSObject)를 해제합니다.

- (NSDictionary*)getBigDictionaryOfSecrets 
{ 

NSDictionary *theDic = [[NSDictionary alloc] init]; 
theDic = // insert contents of dictionary 

return theDic; 
} 

어떻게 하나 제대로이 출시해야합니까?

+1

'theDic = // insert ...'는 누출 일 수 있습니다. 이미 사전을 할당하고 Dic에 할당했습니다. 사전에 값을 넣고 싶다면 초기화 할 때 ('-initWithObjectsAndKeys :'또는 다른 NSDictionary 이니셜 라이저를 보시오) 그렇지 않으면 변경 가능한 사전을 만들고 생성 후에 값을 추가해야합니다. – Caleb

답변

4

시도 return [theDic autorelease]. 사전을 즉시 해제하지 않아 발신자가 retain이 될 수 있습니다.

1

정확하게 이것은 autorelease을위한 것입니다. 같은 것을 할 :

- (NSDictionary*)bigDictionaryOfSecrets 
{ 
    NSDictionary *theDic = [[NSDictionary alloc] initWithObjectsAndKeys:@"bar", @"foo", nil]; 

    return [theDic autorelease]; 
} 

보다 약 autoreleaseMemory Management Programming Guide에서 읽어보십시오.

+1

부수적으로 접두사 "get"은 일반적으로 객체와 값을 간접적으로 반환하는 메소드에 사용됩니다. – albertamg

0

autorelease에서 반환 개체를 설정하면 올바르게 작동합니다. 수신자는 반환 된 객체를 보유해야한다는 것을 기억하십시오.

- (void)populateBigDictionaryOfSecrets(const NSMutableDictionary*)aDictionary 
{ 
    // insert contents of dictionary 
} 

그리고 생성 /가 사용되는 클래스/메소드에 사전을 해제 :이 같은 뭔가를 할 수 대신 autorelease을 사용 또는 제공에 대한 답변에

- (NSDictionary*)getBigDictionaryOfSecrets 
{ 
    NSDictionary *theDic = [[NSDictionary alloc] init]; 
    theDic = // insert contents of dictionary 

    return [theDic autorelease]; 
} 
+0

@Caleb는 호기심에서 벗어나서 왜이 대답 대신 예제 코드를 향상 시켰습니까? – albertamg

+0

@albertamg : 실수. 나는 내가했던 것을 깨달았을 때 편집을 되 돌렸고 그것을 내 자신의 대답으로 옮겼다. – Caleb

0

.

+2

코코아 또는 코코아 터치 개발에서는 일반적이지 않습니다. – Caleb

1

당신은 자동 포기하거나 을 매우 잘 표현합니다. 발신자가 릴리스 할 책임이 있습니다.

+0

호출자가 해제해야하는 객체를 반환하지 않으면 Objective-C의 다른 모든 메소드에 위배됩니다. 프로그래밍의 일관성은 프로그램의 복잡성을 처리하는 방법입니다. 또한 사람들은 일반적으로 문서가 그 이름에서 무엇을해야 하는지를 알 수 없으면 문서를 읽지 않습니다. –

+0

사람들이 문서를 읽지 않는다는 것을 알고 있습니다. 그러나 그들은 어떤 경우에도 위험에 처해 있습니다. 이 경우 "아주 잘"은 h 파일, m 파일의 메소드 헤드 및 사용 된 모든 위치에서 문서화하는 것을 의미합니다. –

관련 문제