2009-09-25 8 views
0

변수 인스턴스 초기화 :인스턴스 변수에 myArray와

@interface AppController : NSObject 
{ 
    NSArray *myArray; 
} 

는 가끔 이런 식으로 초기화에서 myArray 참조 :

- (void)init 
{ 
    [super init]; 
    self.myArray = [[NSArray alloc] init]; 
    return self; 
} 

을 때로는 내가 더 복잡한 방법을 참조하십시오

- (void)init 
{ 
    [super init]; 
    NSArray *myTempArray = [[NSArray alloc] init]; 
    self.myArray = myTempArray 
    [myTempArray release]; 
    return self; 
} 

최종 결과에는 차이가 없다는 것을 알고 있지만 사람들은 왜 더 긴 버전을 수행해야합니까? ?

인스턴스 변수가 @property로 설정되고 @synthesize (변수가 이미 할당 되었기 때문에 가능)하면 더 긴 버전이 더 좋습니다. 이유 중 일부입니까?

감사합니다.

+2

당신이'init' 메소드의 이름을 지었다는 사실은 원격으로도 ini tializer. – bbum

답변

2

myArray 경우 속성이며 retain 또는 copy (가 이런 속성에 대한 있어야합니다으로)이 수행 할 때, 다음 변수를 두 번 유지 될 겁니다로 설정되어 :

self.myArray = [[NSArray alloc] init]; 

alloc 호출은 참조 횟수를 1로 설정하고 속성 할당은이를 유지하거나 복사합니다. (불변 객체의 경우, copy은 대부분 retain에 대한 호출 일 뿐이므로 값을 변경할 수없는 객체를 복사 할 필요가 없습니다.) 할당 후에는 객체가 보유 개수가 2이지만, 그것에 하나의 참조를 들고. 이로 인해 메모리가 누수됩니다.

내가 변수 인스턴스

myArray = [[NSArray alloc] init]; 

또는 적절한 테인 카운트 처리에 직접 할당 중 하나를보고 기대

:

NSArray *newArray = [[NSArray alloc] init]; 
self.myArray = newArray; 
[newArray release]; 

또는 오토 릴리즈 객체의 사용 :

self.myArray = [[[NSArray alloc] init] autorelease]; // Will be released once later 
self.myArray = [NSArray array]; // Convenience constructors return autoreleased objects 
+0

대답 주셔서 감사합니다, 그것은 나를 위해 몇 가지를 정리. –

0

나는 느낌이 당신이 의미 :

NSArray* a = [NSArray arrayWithObjects:@"foo", @"bar", nil]; 

과 제 스타일이

NSArray* a = [[NSArray alloc] initWithObjects:@"foo", @"bar", nil]; 
//... 
[a release]; 

을, 정적 방법은 당신을 위해 돈 당신이 그래서에 ALLOC/초기화/오토 릴리즈를 수행 그럴 필요 없어. 두 번째 스타일을 사용하면 현재 블록을 종료 할 때 자동으로 해제되는 대신 메모리가 해제되는 시점을 제어 할 수 있습니다.

-1

코드가 응용 프로그램을 중단시킵니다. 두 번째 버전은 포인터를 복사 한 다음 인스턴스를 해제합니다. 참조를 해제하기 전에 [object retain]으로 전화해야합니다.

1

이것은 뮤 테이터 ("setters"라고도 함)에서 사용되는 숙어이지만, 약간 잘못 입력했다고 생각합니다. 일반적으로 다음과 같이 표시됩니다.

-(void)setMyName:(NSString *)newName 
{ 
    [newName retain]; 
    [myName release]; 
    myName = newName; 
} 

이 인스턴스는 유지해야하므로 새 이름이 유지됩니다. 옛 이름이 풀려났다. 마지막으로 인스턴스 변수가 새 이름을 가리 키도록 지정됩니다.

관련 문제