2012-04-23 3 views
3

배열의 개체에 대한 메모리 할당과 관련하여 질문이 있습니다. 객체 배열을 만들려고하는데 컴파일 시간에 필요한 객체 수를 알 수 없으므로 필요한 것보다 많은 메모리를 예약하고 싶지 않습니다.개체 배열에 대한 메모리 할당 - 내 이해가 유효합니까?

내가 원하는 것은 필요에 따라 메모리를 할당하는 것입니다. 내가 이것을하고 싶은 방법은 사용자가 "추가"버튼을 클릭하면 배열이 하나의 추가 객체만큼 증가하고 새로운 객체에 필요한 메모리가 할당됩니다. 목표 C의 내 초보자의 이해에

이 (내가 20 년 전 대한 전문 프로그래머, 그리고 최근에 다시 코드를 작성하기 시작했다) 나는 다음과 같은 코드 세그먼트와 함께 올라와있다 :

첫째, 선언 내 목적 : 변수 i가 1의 값으로 밖으로 시작하고 추가 버튼을 때마다 증가 : (참고 : 사용자가 추가 버튼을 클릭하면 다음

NSObject *myObject[1000]; // a maximum number of objects. 

, 그것은 할당 코드와 메소드를 실행 클릭)

++i 
    myObject[i] = [[NSObject alloc] init]; 

따라서 모든 1000 개의 배열 객체가 아니라 실제로 필요한 객체에만 메모리를 할당하고 싶습니다.

정확하게 해석합니까? 즉, 선언에 명시된 배열 요소의 수는 배열 요소의 가능한 최대 수이며 해당 시점에 할당되는 메모리 양은 아니라고 해석합니다. 그것은이 정확하고 이론적으로 선언입니다 :

NSObject *myObject[10000]; 

선언보다 더 많은 메모리 당겨하지 않을까요 :

NSObject *myObject[5]; 

누군가가 내가 제대로이 과정을 이해하고있어 확인 할 수 이 나를 계몽을 내 마음에 섞여있어. :)

고마워요!

+0

NSMutableArray 또는 CFMutableArray를 사용하지 않는 이유는 무엇입니까? 효율적으로 객체를 추가합니다. 다음은 CFArray 소스입니다. http://www.opensource.apple.com/source/CF/CF-635/CFArray.c –

+0

팁을 가져 주셔서 감사합니다. 그게 아마 내가해야 할 일이라고 확신합니다. 나는 지금까지 그 중 누구도 들어 본 적이 없었다. 흥미롭게도, 이론상 바퀴를 다시 발명 한 것임을 알고 있지만, 메모리 할당에 대한 나의 이해가 정확합니까? –

+0

Objective-C 객체의 C 배열을 사용하지 마십시오. 나쁜 생각입니다. 언어가 제공하는 배열 객체를 사용하십시오. 나는 Objective-C 서적을 읽기를 강력히 권유한다. 가장 좋은 것 (IMHO)은 Stephen Kochan의 [Programming In Objective-C] (http://www.amazon.com/dp/0321811909/)입니다. –

답변

3

귀하의 이해는 대부분 정확합니다. 당신이 할 경우 :

NSObject *myObject[1000];

을 즉시 NSObject 경우 1000 포인터에 대한 스토리지를 할당합니다. NSObject 인스턴스는 [[NSObject alloc] init]까지만 할당됩니다.

그러나 10,000 포인터는 확실히 5 개의 포인터보다 더 많은 메모리를 필요로하기 때문에 보다 많은 공간을 사용하게됩니다 (NSObject *myObject[10000]).

연습에 NSObject 인스턴스에 의해 소비되는 공간이 참조하는 포인터에 의해 소비되는 4 바이트보다 훨씬 더 클 것이지만 두 가지, 공간의 NSObject에 대한 포인터, 그리고 NSObject 인스턴스 자체를 소비하는 것을 기억하십시오.

아무튼, 아마도 더 중요한 것은, 코코아에서 동적 객체 할당을 관리하는 더 좋은 방법이 있다는 것입니다. 내장 된 NSMutableArray 클래스를 사용하십시오.Like :

NSMutableArray* objects = [[NSMutableArray alloc] init]; 
[objects addObject: [[[NSObject alloc] init] autorelease]]; 
+0

뛰어난 설명. 감사. 나는 포인터 자체에 메모리가 할당되었다는 사실을 완전히 잊어 버렸다. 기본적으로 개체는 기본적으로 데이터베이스 레코드 유형입니다. 한 무리의 변수와 몇 가지 메소드가 포함 된 NS 객체. –

+0

지금 접근 메서드를 사용하여 개체의 변수에 액세스 할 수 있습니다. x = [myObject var]; myObject를 배열 객체에 추가하면 myObject의 접근 자 메서드를 사용하는 간단한 방법이 있습니까? 나는 그것의 라인을 따라 뭔가가 확실 해요 : x = [[objects ] var]; –

+0

예, 그렇습니다. 그것은'x = [[object objectsAtIndex : ] var]'입니다. [참조 문서] (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html)가 유용 할 수 있습니다. – aroth

4

왜 NSMutableArray를 사용하지 않습니까? initWithCapacity를 사용하거나 단순히 [NSMutableArray array]로 할당 할 수 있습니다. 개체를 추가하거나 제거 할 때 확장 및 축소됩니다. 예 :

NSMutableArray *array = [NSMutableArray array]; 
NSObject *object = [[NSObject alloc] init]; 

[array addObject:object]; // array has one object 
[array removeObjectAtIndex:0]; // array is back to 0 objects 

// remember to relinquish ownership of your objects if you alloc them 
// the NSMutable array was autoreleased but the NSObject was not 
[object release]; 
+0

NSMutableArray 및 NSArray 문서를 확인하여 다른 멋진 기능을 모두 확인하십시오. https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html –

+0

NSArray는 dealloc을 호출 할 때 모든 객체를 해제합니다. 그래서 NSArray 타입의 합성 된 속성을 가지고 있다면, NSArray를 그 내용뿐만 아니라'-dealloc'에서 해제하면됩니다. –

+0

@JackLawrence, 맞습니다. 그러나 객체에 대해 alloc을 호출하면 보유 수는 1 씩 증가합니다. NSArray에 객체를 추가하면 보유 수는 2로 증가합니다. 내가 할 때 [객체 해제]를 호출하지 않았 으면 객체를 제거해야합니다 배열에서 1을 유지하면 개체가 시스템에서 회수되지 않도록 할 수 있습니다. –