Ayrıca, bloğunuz daha sonra tutulan başka bir nesneye başvuruyorsa tutma döngülerinin gerçekleşebileceğini unutmayın self
.
Çöp Toplamanın bu muhafaza döngülerinde yardımcı olabileceğinden emin değilim. Bloğu tutan nesne (sunucu nesnesini çağıracağım self
), (istemci nesnesi)self
, bloğun içindeki , tutma nesnesinin kendisi serbest bırakılıncaya kadar döngüsel olarak kabul edilmez. Sunucu nesnesi istemcilerinden çok daha fazlaysa, önemli miktarda bellek sızıntısı olabilir.
Temiz bir çözüm olmadığı için aşağıdaki geçici çözümleri öneririm. Sorununuzu çözmek için bunlardan birini veya daha fazlasını seçmekten çekinmeyin.
- Blokları yalnızca tamamlama için kullanın , açık uçlu etkinlikler için kullanmayın. Örneğin, gibi yöntemler için bloklar kullanın
doSomethingAndWhenDoneExecuteThisBlock:
;setNotificationHandlerBlock:
. Tamamlama için kullanılan blokların belirli ömürleri vardır ve değerlendirildikten sonra sunucu nesneleri tarafından serbest bırakılmalıdır. Bu, tutma döngüsünün meydana gelse bile çok uzun süre yaşamasını önler.
- Tanımladığınız zayıf referans dansı yapın.
- Nesnenizi yayınlanmadan önce temizlemek için bir yöntem sağlayın; bu nesne, nesnenin kendisine referans olabilecek sunucu nesnelerinden "bağlantısını keser"; ve nesne üzerinde yayın çağırmadan önce bu yöntemi çağırın. Nesneniz yalnızca bir istemciye sahipse (veya bir bağlamda tekil) ise, ancak bu yöntem birden çok istemciye sahipse bozulursa, bu yöntem mükemmeldir. Temel olarak burada tutma sayma mekanizmasını yeniyorsunuz;
dealloc
bunun yerine çağırmaya benzer release
.
Bir sunucu nesnesi yazıyorsanız, yalnızca tamamlanmak üzere blok bağımsız değişkenleri alın. Gibi geri aramalar için engelleme argümanlarını kabul etmeyin setEventHandlerBlock:
. Bunun yerine, klasik temsilci modeline geri dönün: resmi bir protokol oluşturun ve bir setEventDelegate:
yöntemin reklamını yapın . Delege tutmayın. Resmi bir protokol oluşturmak bile istemiyorsanız, seçiciyi temsilci geri çağrısı olarak kabul edin.
Ve son olarak, bu model alarmları çalmalıdır:
- (geçersiz) dealloc {
[myServerObject releaseCallbackBlocksForObject: self];
...
}
self
İçeriden başvurabilecek blokları kancadan çıkarmaya çalışıyorsanız dealloc
, zaten başınız belada demektir. dealloc
bloktaki referansların neden olduğu tutma döngüsü nedeniyle hiçbir zaman çağrılamayabilir; bu, nesnenizin sunucu nesnesi yeniden yerleştirilene kadar sızacağını gösterir.
self
Proxy'lerithis
sadece bir şeyleri ters çevirmek için çağırmayı seviyorum . JavaScript'tethis
kapanışlarımı arıyorumself
, bu yüzden güzel ve dengeli hissediyor. :)