programing

Objective-C / iPhone 앱에서 "클래식"malloc () / free ()를 사용해도됩니까?

nasanasas 2021. 1. 10. 17:24
반응형

Objective-C / iPhone 앱에서 "클래식"malloc () / free ()를 사용해도됩니까?


나는 한동안 아이폰 개발을 가지고 놀아왔다. "하드 코어".NET 개발자라면 조금 어색하지만 익숙해지면 그렇게 나쁘지는 않다.

Objective-C에 대해 읽은 모든 책에는 메모리 관리에 대한 retain/ release(참조 계수)에 대한 이야기 만 있습니다. 오래된 skool의 C / C ++ 개발자, 그것을 사용하여 "일반적인"방법을 할당 이상한 것 같다 malloc()free()일부 각주에서 언급된다.

나는 알고 malloc()free()목표 - C에서 일을하지만 일반적인 방법인지 아닌지 궁금 해요. 결국 100 개의 정수 배열을 할당하려면 이것이 가장 효율적인 방법 인 것 같습니다.

int *array = malloc(sizeof(int) * 100);

memset(array,0,sizeof(int) * 100);

// use the array

free(array);

이것이 정말로 최선의 방법입니까, 아니면 일반 C 메모리 관리를 피해야합니까?


비슷한 작업에 많이 사용하는 원시 메모리 주변에 Objective-C 래퍼가 있습니다 NSMutableData. 소유권을 유지 / 해제 할 수있는 이점이있을뿐 아니라 어레이를 쉽게 확장 할 수 있습니다 (자신이 재할 당하지 않아도 됨).

코드는 다음과 같습니다.

NSMutableData* data = [NSMutableData dataWithLength:sizeof(int) * 100];
int* array = [data mutableBytes];
// memory is already zeroed

// use the array

// decide later that we need more space:
[data setLength:sizeof(int) * 200];
array = [data mutableBytes]; // re-fetch pointer in case memory needed to be copied

// no need to free
// (it's done when the autoreleased object is deallocated)

완벽하게 괜찮습니다. Objective-C는 C의 엄격한 상위 집합이므로 일반 C를 작성하려는 경우 그렇게하는 것을 방해하는 것은 없습니다. 많은 경우 Objective-C 런타임의 오버 헤드 를 사용 malloc하고 free방지하는 것이 유리 합니다.

예를 들어, 알 수없는 정수의 배열을 동적으로 할당해야하는 경우 더 간단하고 쉽습니다.

int *array = malloc(N * sizeof(int));  // check for NULL return value!
// use array[0]..array[N-1]
...
free(array);

대:

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:N];
// use NSMutableArray methods to do stuff with array; must use NSNumbers instead
// of plain ints, which adds more overhead
...
[array release];

I was working on a word game for the iPhone, and we had to load a multi-megabyte dictionary of valid words. The word list was loaded into one giant char array allocated with malloc(), with some clever optimizations to reduce the memory size even more. Obviously for something like this, the overhead of using an NSArray is completely impractical on the limited iPhone. I don't know exactly what the overhead is, but it's certainly more than one byte per character.


Of course, you can use these functions, because Objective-C is merely a superset of C. However, it is fairly uncommon to do this sort of thing, since Objective-C contains objects and ways to make this easier.

After all, you could write the above code as:

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

//Use the array, adding objects when need be

[array release];

Although you would have to create NSNumber objects to store the ints (since NSArray doesn't allow non-object types to be added), it is generally more common to use objects, because it is easier to move data around, and the array classes are integrated more commonly with other Cocoa classes, and the memory management is generally more straightforward than standard C memory management.

Also, if you start adding or removing objects from the array, then the Cocoa array objects make this much easier to do.


If you're dealing with standard C types, it's no less common or "OK" than in C. That's how it's done in C, which is a part of Objective-C.

It's also not unusual to write some kind of object wrapper around these things to bring it into harmony with the rest of Cocoa (KVO, memory management, etc.). So you might create an IntArray class that does the mallocing behind the scenes so you can retain and release it as needed. Note that this isn't strictly necessary — it can just be handy if that kind of structure is a major part of your program.


It's perfectly fine to use malloc and free to do your own memory management. Actually NSObject's allocWithZone: uses malloc to get the memory.

ReferenceURL : https://stackoverflow.com/questions/1150650/is-it-ok-to-use-classic-malloc-free-in-objective-c-iphone-apps

반응형