2011-11-07 5 views
4

저는 Objective-C를 처음 접했고 메모리 관리에 많은 어려움을 겪었습니다. 나는 물체, 예를 들어있는 NSArray * myArray의를 가지고 있고, 나는이nsobject init을 두 번 이상 호출하면 어떻게됩니까? 보유 수를 늘리나요?

myArray = [[NSArray alloc] initWithObjects:obj1,obj2,obj3,nil]; 

을 할 경우 내가 뭔가를하고 그리고 난 새로운 객체를 포함 할 수 myArray의 원하는 다음 다시

[myArray initWithObjects:obj4,obj5,obj6, nil]; 

그것을 초기화하기 내가 필요로하는 것처럼 보이지만 메모리 관리 관점에서 올바른 것인가? 보유 개수가 늘어나는가? 두 번 공개해야합니까?

답변

4

하지 마세요!

일반적으로 이미 존재하는 Objective C 오브젝트 내부의 오브젝트 또는 오브젝트를 재설정하려면 일종의 Setter 메소드를 작성하여 사용하십시오.

배열의 경우 다시 이 작업을 수행하지 마십시오! 당신이 인용 한 "initWithObjects"메소드는 변경되지 않은 (변경 불가능한) 배열을 초기화 할 수있는 편리함을 제공합니다. 배열은 전체 수명 동안 배열로 채워질 것입니다.

당신이하려는 일에 NSMutableArray를 사용하십시오. 그것에 대한 문서는 아래와 같이 표시됩니다 그것은 유지 수를 증가시키지 않습니다

http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html

4

. 초기 alloc은 보유 수를 1로 설정합니다.

즉, 객체에서 init 메소드를 두 번 이상 호출하면 안됩니다. 예가 효과가 있지만 기껏해야 내부 저장소가 누출되어 obj1, obj2obj3을 공개하지 않을 수 있습니다. 최악의 경우 내부 상태가 일치하지 않아 충돌이 발생할 수 있습니다.

그냥이 몇 번을하고 있다면, 당신은뿐만 아니라 새로운 배열을 만들 수 있습니다 : 당신이 루프에서, 예를 들어, 그것을 많이하고 있다면

NSArray* myArray = [NSArray arrayWithObjects:obj1, obj2, obj3, nil]; 
// Do some stuff... 
myArray = [NSArray arrayWithObjects:obj4, obj5, obj6, nil]; 
// Do more stuff 

을, 당신은 아마 사용해야합니다 NSMutableArray :

NSMutableArray* myArray = [NSMutableArray array]; 
for (...) { 
    [myArray removeAllObjects]; 
    [myArray addObject:obj4]; 
    [myArray addObject:obj5]; 
    [myArray addObject:obj6]; 
    // Do stuff 
} 
+0

답장을 보내 주셔서 감사합니다. 왜 당신이 말한 것처럼 할 수 있다면 [myArray alloc] init (이 질문은 배열 만이 아니라 모든 유형의 객체를 염려합니다)을 사용해야하는 이유를 설명해주십시오. myArray = [NSArray arrayWithPbjects]; 할당되지 않은 채로 여전히 작동하는 경우 사람들은 alloc을 왜 사용합니까? –

+0

[NSArray arrayWithObjects :]는 [[[NSArray alloc] initWithObjects :] autorelease]에 대한 바로 가기입니다. – Tony

2

이전 질문입니다. 링크에서

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#semantics-of-init

작은 따옴표 :하지만이 링크로 비슷한 답을 발견

그것은 프로그램에 초기화 방법에 두 개 이상의 통화를 일으킬 위해 정의되지 않은 동작입니다 동일한 객체. 단, 각 init 메소드 호출은 하나 이상의 대리자 init 호출을 수행 할 수 있습니다.

관련 문제