Czy Można używać" klasycznego " malloc () / free () w aplikacjach Objective-C/iPhone?

[7]} bawię się w rozwój iPhone 'a od jakiegoś czasu i chociaż wydaje się to trochę niezręczne, gdy jesteś" hard core " deweloperem. NET, nie jest tak źle, gdy się do tego przyzwyczaisz.

W każdej książce, którą czytam o Objective-C, mówi się tylko o retain/release (zliczanie referencji) do zarządzania pamięcią. Jako stary Programista C/C++ wydaje się dziwne, że przydzielanie "normalnego" sposobu, za pomocą malloc() i free() jest wymienione tylko w niektórych przypisach.

I wiem, że malloc() i free() działają w Objective-C, ale jestem ciekaw, czy jest to powszechna praktyka, czy nie. Po tym wszystkim, jeśli chcę przydzielić tablicę 100 liczb całkowitych, wydaje się, że jest to najbardziej efektywny sposób, aby to zrobić:

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

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

// use the array

free(array);

Czy to rzeczywiście najlepszy sposób, Czy powinienem unikać zwykłego zarządzania pamięcią C?

Author: ricardopereira, 2009-07-19

5 answers

Wokół pamięci raw znajduje się Objective-C, którego lubię używać do podobnych zadań: NSMutableData. Ma tę zaletę, że daje Ci prawo do zachowania / wydania oraz może łatwo powiększać tablicę (bez konieczności samodzielnego robienia realloc).

Twój kod będzie wyglądał następująco:

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)
 84
Author: Nikolai Ruhe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-20 13:04:57

Jest całkiem w porządku -- Objective-C jest ścisłym supersetem C, więc jeśli chcesz napisać zwykłe C, nic cię nie powstrzyma przed tym. W wielu przypadkach korzystne jest użycie malloc i free, aby uniknąć kosztów związanych z uruchomieniem Objective-C.

Na przykład, jeśli chcesz dynamicznie przydzielić tablicę nieznanej liczby całkowitej, często jest to prostsze i łatwiejsze:

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

Przeciw:

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];
[7]}pracowałem nad grą słowną na iPhone ' a i musieliśmy załadować wielomegabajtowy słownik ważnych słów. Lista słów została załadowana do jednej gigantycznej tablicy char przydzielonej z malloc(), z kilkoma sprytnymi optymalizacjami, aby jeszcze bardziej zmniejszyć rozmiar pamięci. Oczywiście dla czegoś takiego, narzut z używania NSArray jest całkowicie niepraktyczny na ograniczonym iPhonie. Nie wiem dokładnie, co to jest narzut, ale na pewno jest więcej niż jeden bajt na znak.
 48
Author: Adam Rosenfield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-19 19:37:51

Oczywiście, ty możesz używać tych funkcji, ponieważ Objective - C jest tylko supersetem C. Jednak jest to dość rzadkie, ponieważ Objective-C zawiera obiekty i sposoby, aby to ułatwić.

Przecież powyższy kod można zapisać jako:

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

//Use the array, adding objects when need be

[array release];

Chociaż musisz utworzyć NSNumber obiekty, aby przechowywać int s (ponieważ NSArray nie pozwala na dodawanie typów innych niż obiektowe), Zwykle używanie obiektów jest bardziej powszechne, ponieważ łatwiej jest przenoszenie danych, a klasy array są integrowane częściej z innymi klasami Cocoa, a zarządzanie pamięcią jest na ogół prostsze niż standardowe zarządzanie pamięcią C.

Jeśli zaczniesz dodawać lub usuwać obiekty z tablicy, wtedy obiekty tablicy Cocoa znacznie to ułatwią.

 5
Author: Alex Rozanski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-19 19:31:43

Jeśli masz do czynienia ze standardowymi typami C, jest to nie mniej powszechne lub " OK " niż w C. Tak to się robi w C, który jest częścią Objective-C.

Nie jest też niczym niezwykłym pisanie jakiegoś rodzaju object wrappera wokół tych rzeczy, aby doprowadzić je do harmonii z resztą Cocoa (KVO, zarządzanie pamięcią itp.). Możesz więc utworzyć klasę IntArray, która wykonuje malloc ING za kulisami, dzięki czemu możesz ją zachować i zwolnić w razie potrzeby. Zauważ, że nie jest to bezwzględnie konieczne - może być po prostu przydatne, jeśli tego rodzaju struktura jest główną częścią programu.

 3
Author: Chuck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-19 20:01:08

Jest całkowicie w porządku używać malloc i za darmo do zarządzania własną pamięcią. W rzeczywistości NSObject ' s allocWithZone: używa malloc do uzyskania pamięci.

 2
Author: Nikolai Ruhe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-19 19:27:02