Hareket + realloc karşı nil bir nesne ayarlama

oy
9

Bu bir çöp toplanan ortam değil

Benim zamanında bir noktada, ben aslen ile inşa edilmiştir farklı bir veri setiyle yeniden başlatmak için gereken bir sınıf örneği değişken var.

Varsayımsal Bir varsa, ne konuşma NSMutableArrayveya NSMutableDictionarygibi bir şey yapmak daha verimli olacaktır:

[myArr release];
myArr  = [[NSMutableArray alloc] init....];

ya da sadece,

myArr = nil;

myArr nesne serbest ve bellekte depolanması yüzden yeniden kullanamazsınız myArr bir gösterici olmadan beni bırakacak mısın?

Oluştur 09/03/2009 saat 17:03
kaynak kullanıcı
Diğer dillerde...                            


6 cevaplar

oy
21

Bunu yaparsanız myArr=nil;kendiliğinden, o zaman gönderebilir hangi işaretçiyi kaybettim releasemesajı. Hiçbir sihirli yoktur releaseNesnenizin.

Ve Georg söylediği gibi, sizin nesneyi serbest bırakmak mümkün olmadan, o hafıza 'sızdırılmış olmuştur.

Cevap 09/03/2009 saat 17:07
kaynak kullanıcı

oy
6

Bir özelliğini kullanın ve bellek sızıntısı olmadan istediğiniz hemen hemen sözdizimi alabilir.

diziyi bildirmek için bu sözdizimini kullanın

@property (readwrite, retain) NSMutableArray *myArray;

Sonra bunu böyle yeniden başlangıç:

[self setMyArray:[NSMutableArray array]];
Cevap 09/03/2009 saat 17:59
kaynak kullanıcı

oy
5

Mac OS üzerinde olsaydı, değil iPhone OS Ben çöp toplayıcı etkin olup olmadığına bağlıdır söyleyebilirim:

  • Kullanım: GC ile myArr = nil;
  • Kullanım: GC olmadan [myArr release];

Ne yazık ki, iPhone'da, hiçbir çöp toplama yoktur, bu nedenle bellek sızıntılarını istemiyorsanız, size artık gerek kez nesneyi serbest bırakmak zorunda.

Cevap 09/03/2009 saat 17:13
kaynak kullanıcı

oy
4

ilk kod bloğu gayet iyi. Ancak, ikinci blok kullanabilirsiniz bir dizi ile size bırakmaz yüzden yeterli değildir. Yarım bu bloğu düzelterek, ne demek düşünüyorum:

myArr = nil;
myArr = [[NSMutableArray alloc] init....];

Ancak bu myArr serbest değildir çünkü ya istediğini başarmak etmez. Eğer myArr için bir ayarlayıcı sentezlenmiş varsa, o zaman, pasör (self.myArr) kullanılarak yerine doğrudan (myArr) işaretçisi erişerek size nil ayarını istediğiniz bırakma davranışı elde edebilirsiniz. tam ikinci blok düzeltme:

self.myArr = nil;
myArr = [[NSMutableArray alloc] init....];

Şimdi eşdeğer kod örnekler var, nil ile birini kullanarak ayarlayıcı, diğer değil serbest bırakmak için. Onlar aynı.

myArr Bu örneklerde olduğu gibi, bir değişken dizi, en etkili yöntem, sadece geri İstem belleği serbest tüm işlem önlenmiş olmaktadır, removeAllObjects kullanmaktır:

[myArr removeAllObjects];
Cevap 02/12/2009 saat 11:08
kaynak kullanıcı

oy
1

ne istediğini bir NSMutableArray / NSMutableDictionary içeriğini sıfırlamak için ise, ayrıca removeAllObjects çağırabilir ve çalışmak için taze bir dizi / dicti var.

Cevap 13/03/2009 saat 22:37
kaynak kullanıcı

oy
1

farkı fark etmenin bir yolu bu olabilir: nil nesnesine bir şey yapmaz bir nesneye bir başvuru ayarlama, sadece referans bir şey yok.

"Nesne serbest bırakılması" "hiçbir şey" olmadığını, bu yüzden bunu yapmaz. :) Bir çöp toplama işlemine dilinde bu referansı bırakarak bir yan etkisi olarak o yapabilir, ama Objective C bu şekilde çalışmıyor.

Cevap 09/03/2009 saat 17:09
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more