/ / Obj-C: Właściwe zwalnianie przydzielonych obiektów w pętli - cel-c, zarządzanie pamięcią, wycieki pamięci, zarządzanie wydaniami, zachowanie

Obj-C: Prawidłowe zwolnienie przydzielonych obiektów w pętli - cel-c, zarządzanie pamięcią, wycieki pamięci, zarządzanie wydaniami, zachowanie

Mam nadzieję, że dobrze to wyjaśnię. Załóżmy, co następuje:

@interface ClassA : NSObject {
NSMutableArray firstArray;
NSArray secondArray;
}

#import "ClassA"
@interface ClassB : NSObject {
ClassA classAobject;
}

Następnie w innej części programu „Psuedo-code” uzyskując dostęp do kluczy słownika takich jak:

NSMutableArray* sample = [[NSMutableArray alloc] init];
for (keys in Data)
{
ClassA* aObj = [[ClassA alloc] initWith: objectForKey:@"KeyHere" andWith:@"Key2Here"];

ClassB* bObj = [[ClassB alloc] init];
[bObj setClassAObj: aObj];

[sample addObject: bObj];
}
Singleton* single = [Singleton single];
[single setArray: sample];

Moje pytanie dotyczy obiektów ClassA i ClassButworzone w pętli i macierz do przechowywania ich poza pętlą. Czy przecieka mi pamięć, nie zwalniając ich? Jeśli je wypuszczę, jak mogę to zrobić w taki sposób, aby nie stracić odniesienia do nich w singletonie, do którego przechowuję tablicę „sample”?

Jeśli ma to znaczenie, tablica Singleton, do której jest przechowywana, jest przydzielana i inicjowana w metodzie „init” klasy.

Odpowiedzi:

1 dla odpowiedzi № 1

Dodawanie obiektów do tablicy zachowuje obiekty. Więc musisz je zwolnić po ich dodaniu (jeśli nie zostanie automatycznie zwolniony). Podobnie, musisz upewnić się, że @properties dla tablicy zmiennych instancji (w Singleton) jest ustawione tak, aby zachować próbkę, tak aby była zachowywana po ustawieniu w singletonie. Następnie musisz zwolnić próbkę.

Ponadto zmienne instancji muszą być wskaźnikami:

@interface ClassA : NSObject {
NSMutableArray *firstArray;
NSArray *secondArray;
}

#import "ClassA"
@interface ClassB : NSObject {
ClassA *classAobject;
}

1 dla odpowiedzi nr 2

NSMutableArray zachowuje i zwalniaobiekty w miarę ich dodawania i usuwania. Otrzymujesz więc jeden dla alokacji, a drugi dla addu. Gdy tablica zostanie zniszczona, zwolni jeden. Pozostawia ci to liczbę 1.

Możesz zrobić te autorelease. Uważam, że poprawia wydajność, aby pamięć została zwolniona i jest zalecanym podejściem.