-retainCount
Şimdiye kadar hangi durumda kullandınız ve nihayetinde onu kullanarak ortaya çıkabilecek sorunları bilmek isterim .
Teşekkürler.
-retainCount
Şimdiye kadar hangi durumda kullandınız ve nihayetinde onu kullanarak ortaya çıkabilecek sorunları bilmek isterim .
Teşekkürler.
Yanıtlar:
Asla kullanmamalısın -retainCount
, çünkü sana asla yararlı bir şey söylemiyor. Foundation ve AppKit / UIKit çerçevelerinin uygulanması opaktır; neyin alıkonulduğunu, neden saklandığını, kimin elinde tuttuğunu, ne zaman saklandığını vb. bilmiyorsunuz.
Örneğin:
[NSNumber numberWithInt:1]
bir olurdu retainCount
1 olarak Gelmez. 2.@"Foo"
bir olurdu retainCount
1 olarak Gelmez. 1152921504606846975.[NSString stringWithString:@"Foo"]
bir olurdu retainCount
1 olarak Gelmez. Yine 1152921504606846975.Temel olarak, herhangi bir şey bir nesneyi tutabileceğinden (ve dolayısıyla onu değiştirebileceğinden retainCount
) ve bir uygulamayı çalıştıran kodun çoğunun kaynağına sahip olmadığınız için, bir nesneninki retainCount
anlamsızdır.
Bir nesnenin neden ayrılmadığını bulmaya çalışıyorsanız, Aletler'deki Sızıntılar aracını kullanın. Bir nesnenin neden çok erken ayrılmasının izini sürmeye çalışıyorsanız, Instruments'daki Zombies aracını kullanın.
Ama kullanmayın -retainCount
. Gerçekten değersiz bir yöntem.
Düzenle
Lütfen herkes http://bugreport.apple.com adresine gidin ve -retainCount
kullanımdan kaldırılmasını isteyin . Ne kadar çok insan bunu isterse o kadar iyi.
düzenle # 2
Güncelleme olarak, [NSNumber numberWithInt:1]
şimdi retainCount
9223372036854775807'ye sahip . Kodunuz 2 olmasını bekliyorsa, kodunuz artık bozulmuştur.
- (NSUInteger)retainCount{return NSUIntegerMax;}
.
retainCount
.
Ciddi anlamda. Sadece yapma.
Sadece izleyin Bellek Yönetimi Kuralları ve sadece ne bırakın alloc
, new
ya da copy
(ya da ne denir retain
aslen üzerine).
@bbum en iyi burada SO'da ve blogunda daha ayrıntılı olarak söyledi .
-retainCount
(çok daha ayrıntılı olarak) Aletlerden ve araçlarından elde edilebilir.
retain
, retain
, retain
, autorelease,
otomatik salma, autorelease
örneğin, UIKit API aracılığıyla bir nesne geçen mükemmel geçerli sonucu olabilir.
Otomatik olarak yayımlanan nesneler, -retainCount denetiminin bilgilendirici olmadığı ve potansiyel olarak yanıltıcı olduğu durumlardan biridir. Saklama sayısı, bir nesnede kaç kez -otomatik sürümün çağrıldığı ve dolayısıyla mevcut otomatik serbest bırakma havuzu boşaldığında kaç kez serbest bırakılacağı hakkında size hiçbir şey söylemez.
Ben do 'Instruments' kullanarak işaretlendiğinde çok faydalı retainCounts bulabilirsiniz.
'Tahsisler' aracını kullanarak, 'Referans sayılarını kaydet' seçeneğinin açık olduğundan emin olun ve herhangi bir nesneye girebilir ve keepCount geçmişini görebilirsiniz.
Allocs ve sürümleri eşleştirerek neler olup bittiğini iyi bir şekilde görebilir ve genellikle bir şeyin yayınlanmadığı bu zor durumları çözebilirsiniz.
Bu beni asla yarı yolda bırakmadı - iOS'un erken beta sürümlerinde hata bulma dahil.
NSObject'teki Apple belgelerine bir göz atın, sorunuzu hemen hemen kapsıyor: NSObject keepCount
Kısacası, kendi referans sayma sisteminizi uygulamadığınız sürece KeepCount muhtemelen sizin için işe yaramaz (ve sahip olmayacağınızı neredeyse garanti edebilirim).
Apple'ın kendi ifadesiyle, keepCount, "bellek yönetimi sorunlarının ayıklanmasında tipik olarak hiçbir değeri yoktur".
Elbette, kodunuzda retCount yöntemini asla kullanmamalısınız, çünkü değerinin anlamı nesneye kaç otomatik sürümün uygulandığına bağlıdır ve bu tahmin edemeyeceğiniz bir şeydir. Bununla birlikte, hata ayıklama için çok kullanışlıdır - özellikle ana olay döngüsünün dışındaki Appkit nesnelerinin yöntemlerini çağıran koddaki bellek sızıntılarını araştırırken - ve kullanımdan kaldırılmamalıdır.
Kendi fikrinizi belirtme çabanızda, değerin anlaşılmaz doğasını ciddiye aldınız. Her zaman bir referans sayısı olmadığı doğrudur. Bayraklar için kullanılan bazı özel değerler vardır, örneğin bir nesnenin asla ayrılmaması gerektiğini belirtmek için. 1152921504606846975 gibi bir sayı siz onaltılık olarak yazıp 0xfffffffffffffff alana kadar çok gizemli görünüyor. Ve 9223372036854775807, hex biçiminde 0x7fffffffffffffff'dir. KeepCount'u saniyede 100.000.000 kez artırdığınızı varsayarsak, daha büyük sayı kadar yüksek bir holdCount elde etmenin neredeyse 3000 yıl alacağı düşünüldüğünde, birinin bu gibi değerleri bayrak olarak kullanmayı seçmesi gerçekten şaşırtıcı değildir.
Kullanarak ne gibi sorunlar yaşayabilirsiniz? Tek yaptığı nesnenin saklama sayısını döndürmektir. Onu hiç aramadım ve aramam için herhangi bir sebep düşünemiyorum. Yine de ayrılmadıklarından emin olmak için tekillerde geçersiz kıldım.
retainCount
bellek yönetimi için kullanılan hiçbir kod yolu yoktur .
Uygulamanız çalışmaya başlayana ve faydalı bir şey yapana kadar bellek sızıntısı konusunda endişelenmemelisiniz.
Bir kez, Aletleri çalıştırın ve uygulamayı kullanın ve bellek sızıntısı gerçekten olup olmadığını görün. Çoğu durumda, bir nesneyi kendiniz yaratırsınız (böylece ona sahip olursunuz) ve işiniz bittikten sonra onu bırakmayı unuttunuz.
Kodunuzu yazarken denemeyin ve optimize etmeyin, uygulamayı normal olarak kullandığınızda neyin bellek sızıntısı olabileceğine veya çok uzun sürebileceğine dair tahminleriniz genellikle yanlıştır.
Doğru kodu deneyin ve yazın, örneğin, ayırma ve benzeri kullanarak bir nesne yaratırsanız, onu doğru şekilde serbest bıraktığınızdan emin olun.
-retainCount
.