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 № 1Dodawanie 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.