Is it ok to use "classic" malloc()/free() in Objective-C/iPhone apps?

c, memory-management, objective-c

Solution

There's an Objective-C wrapper around raw memory which I like to use a lot for similar tasks: `NSMutableData`. It has the benefit of giving you retain/release ownership plus it can grow the array easily (without having you to do the realloc yourself).

Your code would look like:

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)

Problem

I've been playing around with iPhone development for a while, and although it feels a bit awkward when you're a "hard core" .NET developer, it's not all that bad once you get used to it. In every book I read about Objective-C, there's only talk about `retain`/`release` (reference counting) for memory management. As an old-skool C/C++ developer, it seems strange that allocating the "normal" way, using `malloc()` and `free()` is only mentioned in some footnotes. I know that `malloc()` and `free()` work in Objective-C, but I'm curious if it is common practice or not. After all, if I want to allocate an array of 100 integers, it seems that this is the most efficient way to do it: ``` int *array = malloc(sizeof(int) * 100); memset(array,0,sizeof(int) * 100); // use the array free(array); ``` Is this indeed the best way, or should I avoid plain C memory management?

Original source