2009-09-08 21 views

Odpowiedz

16

Jak wspomniano, nie można wyświetlić źródła (chociaż można dezasemblować metodę za pomocą gdb).

Sam sposób tworzy niezmienny (nie może być zmieniony), autoreleased kopię danej tablicy. Następujące są identyczne w zachowaniu:

// Both resulting arrays are immutable and won't be retained 
NSArray* immutableArray = [[[NSArray alloc] initWithArray:mutableArray] autorelease]; 
NSArray* immutableArray = [NSArray arrayWithArray:mutableArray]; 
NSArray* immutableArray = [[mutableArray copy] autorelease]; 

Wybierz dowolną wersję na podstawie zwięzłości, chyba :-).

+0

Hmmm ... Jest niezmienny? Cóż, muszę wysłać każdemu obiektowi w nowej tablicy dodatkowy komunikat o zwolnieniu (użył alokacji init), aby nie było wycieków. Jak zwolnić wszystkie obiekty w niezmiennej tablicy? – RexOnRoids

+0

obiekty są zatrzymywane przez tablicę, gdy są dodawane, więc gdy tablica zostanie zwolniona, obiekty wewnątrz powinny być również zwolnione. – slf

+0

Dlaczego potrzebujesz nowej tablicy tylko po to, aby wysłać wiadomość o zwolnieniu do obiektów? Niezmienny oznacza, że ​​ARRAY nie może być zmieniony, zawsze możesz zmienić (lub wysłać wiadomości do) obiektów wewnątrz tablicy ... Albo jeszcze lepiej, autorelease obiekty przed dodaniem ich do tablicy, a następnie nie musisz się martwić o nic . –

2

Nie, kakao nie jest open source.

Jeśli masz pytanie, powinieneś po prostu o to zapytać.

Byłoby jedną prawidłową drogę do jego realizacji:

+ (id)arrayWithArray:(NSArray *)array { 
    return [[[self alloc] initWithArray:array] autorelease]; 
} 

można odczytać źródło gnustep dla NSArray, ale należy pamiętać, że jest to alternatywna implementacja API kakao.

2

Jeśli pytasz, co jest celem +arrayWithArray (oprócz tego, że owijka autorelease wokół -initWithArray), powiedziałbym, że jest to: Użyj go, gdy chcemy utworzyć autoreleased kopię tablicy. Innymi słowy, można zobaczyć to tak:

NSArray * original = /* ... */; 
NSArray * newArray = [NSArray arrayWithArray:original]; 

jest równoznaczne z:

NSArray * original = /* ... */; 
NSArray * newArray = [[original copy] autorelease]; 

Powiedziałbym, że to nie dla wygody w użyciu, gdy pasuje do Twojego stylu.

+1

To nie do końca prawda. Twoje założenie jest takie, że 'oryginał' to NSArray. Ale może to być wszystko, co pochodzi od NSArray. Klasa obiektu może implementować własną "kopię". Dlatego autorelease [[original copy]]; nie ma gwarancji, że zwróci NSArray. – Coyote

0

GNUstep, wdrożenie GNU spec OPENSTEP z którego Cocoa i Cocoa Touch zejść, wdraża +arrayWithArray: następująco:

/** 
* Returns a new autoreleased NSArray instance containing all the objects from 
* array, in the same order as the original. 
*/ 
+ (id) arrayWithArray: (NSArray*)array 
{ 
    id o; 

    o = [self allocWithZone: NSDefaultMallocZone()]; 
    o = [o initWithArray: array]; 
    return AUTORELEASE(o); 
} 

http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSArray.m?view=markup

Powiązane problemy