2010-12-27 10 views
2
내가 스탠포드에 의해 게시 훌륭한 iTunesU 과정을 통해 목표 - C와 아이폰 OS 프로그래밍을 배우고

(http://www.stanford.edu/class/cs193p/cgi-bin/drupal/)메모리 관리

할당이 변수로 계산기를 만드는 것입니다 버튼. 명령 체인 (예 : 3 + x-y)은 "anExpression"으로 NSMutableArray에 저장되고 NSDictionary를 기반으로 x 및 y에 대해 무작위 값을 사용하여 솔루션을 얻습니다. 할당의이 부분은 나를 트립된다

마지막 두 [방법] 속성 목록에서 /에 anExpression을 "변환"당신은 강의에서 기억할 것

+ (id)propertyListForExpression:(id)anExpression; 
+ (id)expressionForPropertyList:(id)propertyList; 

은 속성 목록은 단지입니다 NSArray, NSDictionary, NSString, NSNumber, 등의 조합으로, anExpression은 이미 속성 목록이므로이 메서드가 필요한 이유는 무엇입니까? (우리가 작성하는 표현식은 NSMutableArrays이며 NSStringNSNumber 개 오브젝트 만 포함되어 있기 때문에 실제로는 이미 속성 목록입니다.) API의 호출자는 anExpression이 속성 목록이라는 것을 모르기 때문에. 이것이 호출자에게 공개하지 않기로 선택한 내부 구현 세부 사항입니다.

anExpression이 이미 속성 목록이므로이 두 메서드의 구현이 쉽다고 생각할 수도 있습니다. 따라서 인수를 바로 반환 할 수 있습니까? 네, 그렇습니다. 이것에 대한 메모리 관리는 약간 까다 롭습니다. 알아낼 수 있도록 최선을 다할 것입니다. 최선을 다해라.

필자는 왜 메모리 관리와 관련하여 무언가를 놓치고 있습니다. 왜 필자가 전달 된 인수를 바로 반환 할 수 없는지 알지 못하기 때문입니다.

미리 답변 해 주셔서 감사합니다.

답변

4

는이 작업을 수행 할 경우 발생하는 고려 :

NSArray *somePropertyList = [[NSArray alloc] initWithContentsOfFile:@"..."]; 
id otherPropertyList = [SomeClass propertyListForExpression:somePropertyList]; 
[somePropertyList release]; 

// 'somePropertyList' has been destroyed... 
// is 'otherPropertyList' valid at this point? 
[otherPropertyList writeToFile:@"..." atomically:YES]; 

전형적인 목표 - C 패턴은, 그러므로, retainautorelease에, 그래서 발신자는 여전히 메모리를 관리해야하지만 그렇게하지 않습니다 개체가 너무 일찍 소멸되지 않습니다.

+ (id)propertyListForExpression:(id)expr { 
    // increments the retain count by 1 
    // then sets it up to be decremented at some point in the future 
    // (thus balancing it out, and the caller doesn't have to do anything) 
    return [[expr retain] autorelease]; 
} 
+0

일종의 접근 자입니다. 감사합니다, 고마워요! – iOSNewb