2012-08-07 10 views
5

Powiel możliwe:
NSMutableArray initWithCapacity nuances
Objective-c NSArray init versus initWithCapacity:0Inicjowanie NSMutableArray i bez zdolności

Jaka jest różnica między następujący wiersz kodu? jaka jest dokładna przewaga i wada? załóżmy, że zrobię 3 operację addObject.

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity: 5]; 
NSMutableArray *array = [[NSMutableArray alloc] init]; 
+0

Nie jest to dokładny duplikat któregokolwiek z tych pytań, chociaż jest bardzo zbliżony do najwyższego. – JeremyP

+0

możliwy duplikat [Objective-c NSArray init versus initWithCapacity: 0] (http://stackoverflow.com/questions/6077422/objective-c-nsarray-init-versus-initwcapacity0), [NSMutableArray initWithCapacity: nuances] (http: //stackoverflow.com/questions/3948062/), –

Odpowiedz

5

Zwykle różnica między językami zorientowanymi obiektowo i tablicami o różnych rozmiarach jest następująca: narzut, który otrzymasz, oraz błędy stron na poziomie pamięci.

Aby umieścić to w inny sposób, wyobraź sobie, że masz obiekt, który żąda 5 spacji w pamięci (tak jak pierwszy przykład), a drugi obiekt nie rezerwuje żadnej przestrzeni. Dlatego, gdy obiekt musi zostać dodany do pierwszego, będzie już miejsce w pamięci, aby po prostu się zapadło, z drugiej strony nieprzydzielony obiekt najpierw będzie żądał miejsca w pamięci, a następnie doda je do szyk. To nie brzmi tak źle na tym poziomie, ale kiedy twoje tablice zwiększają rozmiar, staje się to ważniejsze.

Od Apple's documentation:

arrayWithCapacity:

Tworzy i zwraca obiekt NSMutableArray z wystarczająco przydzielonej pamięci początkowo pomieścić określoną liczbę przedmiotów. ... Początkowa pojemność nowej tablicy. Zwracana wartość Nowy obiekt NSMutableArray z dostatecznie zaalokowaną pamięcią do przechowywania obiektów numItems.

+0

Dobre przypuszczenie, ale tak naprawdę nie jest tak, co się dzieje ... zobacz odpowiedź Jeremy'ego. – bbum

+0

@bbum Myślę, że to nie jest domysły. To właściwe wyjaśnienie. Podczas gdy w odpowiedzi Jeremy'ego użył, być może. – Saad

+1

@Sad Nie, naprawdę, to jest domysły. Przeczytaj źródło (CFFoundation to open source). Jeśli poprosisz o tablicę zawierającą 100 000 automatów, nie musi koniecznie przydzielać wszystkich tych gniazd z wyprzedzeniem. Struktura danych jest nieco bardziej złożona niż tablica płaskopodobna, a zatem dokumentacja wprowadza w błąd, ale nie jest całkowicie błędna. – bbum

8

Funkcjonalnie oba stwierdzenia są identyczne.

W pierwszym przypadku dajesz wskazanie czasu pracy, że wkrótce dodasz pięć obiektów do tablicy, aby mogła, jeśli chce, wstępnie przydzielić trochę miejsca dla nich. Oznacza to, że pierwszych pięciu wywołań addObject: może być marginalnie szybciej przy użyciu pierwszej instrukcji.

Nie można jednak zagwarantować, że czas działania spowoduje zignorowanie podpowiedzi. Nigdy nie używam sam initWithCapacity:. Jeśli kiedykolwiek dojdę do sytuacji, w której addObject: jest znaczącym wąskim gardłem wydajności, mogę spróbować sprawdzić, czy sytuacja się poprawi.

+1

Dobrze - lub, mówiąc wprost: nie zawracaj sobie głowy wersją z podpowiedziami. – bbum

Powiązane problemy