Objective-C : AutoreLeased 초기화와 생성자의 유지가 잘못 되었습니까?
-
07-07-2019 - |
문제
내 @interface
거기에 NSArray *Monate
다음과 같은
@property (nonatomic, retain) NSArray* Monate;
만약 내가한다면:
filePath = [[NSBundle mainBundle] pathForResource:@"SomeFile" ofType:@"plist"];
self.Monate = [NSArray arrayWithContentsOfFile:filePath];
생성자에서는 자동 소개 객체로 설정됩니다 (정확합니까?). 그래서 내가해야하나요 [Monate retain]
나중에?
해결책
이 코드는 정확합니다. 보유 전화를 추가해서는 안됩니다.
+[NSArray arrayWithContentsOfFile:]
AutorELeased를 반환합니다 NSArray
. 그것을 전달합니다 -[YourClass setMonate:]
물체를 유지하고 후원 IVAR에 할당합니다. 생성자가 돌아온 후 새 NSArray
유지 수는 2이며 현재 자동 제출 풀에 한 번 추가됩니다 (순 그물 수는 1).
거래소에서 배열을 릴리스하는 한이 코드가 정확합니다.
다른 팁
당신은 후에 보유하지 않아야합니다. @property of retain을 설정하면 self.monate setter를 사용할 때 특별한 일이 발생합니다.
1) Monate 인스턴스 변수의 모든 것이 릴리스됩니다.
2) 새로운 과제는 유지됩니다.
@property of antary를 사용하려면 유지해야하지만, 당신은 당신이있는 그대로 괜찮습니다.
참고로, 대상 C에서 대문자 단어는 일반적으로 클래스 이름을 위해 예약되어 있습니다. 나는 "Monate"대신 "Monate"에 그것을 sugges니다.
nsarray arraywithContentsOffile :]; 방법의 끝보다 더 오래 매달려면 유지 해야하는 자동 엘라 드 배열을 반환합니다.
귀하의 재산 선언이 어떻게 '유지'를 지정하는지 확인하십시오. 이것은 모든 self.property = x를 의미합니다. 당신이하는 전화는 당신이 통과하는 객체를 유지합니다.
그래서 당신이하는 일이 맞습니다. self.property = nil; 당신의 거래 방법에서.
NIL에 속성을 설정하면 이전 객체를 풀고 포인터를 NIL로 설정합니다. 이것이 올바른 방법입니다.