2009-11-11 4 views
2

이것은 아마도 어리석은 질문 일 뿐이지 만 분명한 대답이 없으면 잠시 생각해 왔습니다.NSMUtableArray 인스턴스 변수를 할당해야합니까?

나는 작업하고있는 NSMutableArray 인스턴스 변수에 문제가있는 작은 응용 프로그램이 있습니다. viewDidLoad에 [[NSMutableArray alloc] init]을 추가하기 전까지는 항상 (null)이었습니다.

저는이 문제에 대한 이해를 얻기 위해 Objective C 세계에 새로운 내용을 접했습니다. 나는 클래스를 인스턴스화 할 때 인스턴스 변수가 모두 alloc'd라는 인상을 받았다. alloc/init을 사용하지 않고 배열에 항목을 추가하면 보유 개수가 0 인 채로 (null) 유지됩니다.

해당 배열이 (보유) 속성으로 선언되었습니다.

명확하지 않으면 코드를 추가 할 수 있습니다.

답변

5

개체 인 인스턴스 변수는 실제로는 nil (0)으로 초기화되는 포인터 일뿐입니다. 이것이 아이템이 유지되지 않고 배열에 추가되지 않는 이유입니다. 왜냐하면 nil 객체에 대한 메시지가 nil/0을 반환하기 때문입니다.

클래스의 init에서 객체를 할당하고 초기화 한 다음 dealloc에서 객체를 릴리스해야합니다.

+0

그래서 포인터가 생성되었지만 실제로 메모리가 없습니다 인스턴스화시 할당 되었습니까? 내 ivar을 (보유) 속성으로 선언하면 생성 된 setter가 메모리를 할당합니까? – Eric

+1

@Eric : setter가 변수에 메모리를 할당하는 것은 의미가 없습니다. setter에 유효한 인스턴스를 전달해야합니다.이 경우 메모리는 이미 할당되어 있습니다. 이 언어가 특정 유형으로 선언 되었기 때문에 이바라가 어떻게 설정 되길 원하는지 마술 적으로 언어가 알 수있는 방법이 없습니다. – Chuck

+0

@Chuck : 이제 알겠습니다. 도와 주셔서 대단히 감사합니다! – Eric

2

속성 선언의 retain/assign/copy 한정자는 컴파일러에서 사용자를 위해 합성하는 getter 및 setter에서 속성 값의 메모리를 관리하는 방법에 대한 것입니다. (The documentation에서 자세하게 설명하고 각 종류의 예제 코드를 제공합니다.)

인스턴스 변수의 초기화 여부는 완전히 직각입니다. ivar을 선언하는 것은 값을 저장하는 것입니다. Objective-C 클래스의 경우 인스턴스에 대한 포인터입니다. 런타임 이이 ivars를 0으로 초기화하지만 거기에 저장하려는 객체를 만드는 것은 여전히 ​​책임이 있습니다. (Java 나 C#과 같은 비슷한 언어에서도 마찬가지입니다. Array 인스턴스 변수를 선언하면 참조를위한 공간이 생기므로 배열을 만들지 않습니다.)

+0

ivar이 값을위한 공간을 예약한다고 말하면, 객체에 사용 된 실제 메모리가 아닌 포인터 값을 참조하고 있습니까? – Eric

+0

수정하십시오. ivar는 포인터 일뿐입니다. 런타임은 인스턴스가'alloc'ed 일 때 그것을'nil'으로 설정합니다. 여러분이 무언가를 가리 키지 않는 한 결코 달라지지 않을 것입니다. –

관련 문제