2009-09-16 3 views
0

@interface theres a NSArray *Monate 다음 :Objective-C : 자동 생성 된 초기화와 생성자에서의 유지가 잘못 되었습니까?

내가 할 경우 :

filePath = [[NSBundle mainBundle] pathForResource:@"SomeFile" ofType:@"plist"]; 
self.Monate = [NSArray arrayWithContentsOfFile:filePath]; 

생성자에서 autoreleased 개체에 맞습니까? 그럼 나중에 [Monate retain]해야합니까?

+0

다른 하나의 메모 : ivars의 이름을 대문자로 사용하지 마십시오. Obj-C 규약은 대문자로 된 이름이 클래스를위한 것입니다. – NSResponder

답변

4

이 코드는 올 바릅니다. 보존 통화를 추가하면 안됩니다.

+[NSArray arrayWithContentsOfFile:]은 자동 재생 됨 NSArray을 반환합니다. 이 값을 -[YourClass setMonate:]으로 전달하면 해당 오브젝트가 유지되고 받침대에 할당됩니다. 생성자가 반환 된 후 새로운 NSArray은 보유 수 2를 가지며 현재 자동 회수 풀에 1 회 추가됩니다 (결과적으로 순수 보유 수는 1이됩니다)

dealloc에서 배열을 릴리스하면이 코드가 맞습니다.

2

이후에 보관하지 마십시오. retain의 @property를 설정하면 self.Monate setter를 사용할 때 특별한 일이 발생합니다.

1) Monate 인스턴스 변수에있는 모든 항목이 있으면 릴리스됩니다.
2) 새 과제가 유지됩니다.

할당의 @property를 사용하려면 보유해야하지만 사용자가 괜찮습니다.

객관적 -c에서 대문자 단어는 대개 클래스 이름 용으로 예약됩니다. "Monate"대신 "Monate"로 바꾸면 도로 혼란을 초래할 수 있습니다.

0

[NSArray arrayWithContentsOfFile :]; 메서드의 끝 부분보다 오래 걸리 길 원한다면 유지해야 할 자동 레이아웃 배열을 반환합니다.

속성 선언에 '보유'가 지정되어 있는지 확인하십시오. 이것은 모든 self.property = x; 당신이하는 호출은 당신이 지나가는 객체를 유지할 것입니다.

그래서 당신이하고있는 일은 맞습니다. self.property = nil을 수행하는 것을 잊지 마십시오. 귀하의 dealloc 방법.

속성을 nil로 설정하면 이전 개체가 해제되고 포인터를 nil로 설정하면 올바른 방법입니다.