Anlayış başvuru Kakao ve Objective-C ile sayma
Sadece iPhone SDK ile oynamak için bir görünüm ile Objective-C ve Kakao bir bakmaya başladım. malloc
free
kavram C ile oldukça rahatım, ama Kakao referansları sayan bir grubun beni oldukça karıştırdı. Bunu anladığınızda çok zarif söylendi, ama sadece tepeyi aşmış değilim.
Nasıl release
, retain
autorelease
iş ve kullanımları ile ilgili kuralları nelerdir?
(Onu da yapamazsa, size yardımcı okunur?)
CEVAP
Başlayalım temel kavramları anladığınızda retain
release
; autorelease
ile gerçekten sadece özel bir durumdur.
Kakao, her başvurulan nesne olduğunu nasıl takip (özellikle NSObject
temel sınıf uygulayan) tutar. Bir nesne üzerinde retain
çağırarak, tek bir başvuru sayısı için istediğini söylüyorsun. release
, nesneyi söyle çağırarak bırakıyorsun ve başvuru indirildiği sayısıdır. Eğer, release
, başvuru sayısı şu an sıfır çağrıldıktan sonra, o nesnenin bellek sistemi tarafından serbest.
Bu malloc
free
farklı temel yolu, herhangi bir nesnenin kullandığı bellek serbest. çünkü sistemin diğer parçaları çökmesini hakkında endişelenmenize gerek yok. Herkes birlikte oynamak ve/kodu bir parça taşıması kurallarına göre serbest, istinat ve sonra nesneyi bültenleri varsayarak, kodu da nesne başvuran diğer parça etkilenmeyecektir.
Bazen kafa karıştırıcı olabilir ne altında retain
release
aramalısın şartlar bilmektir. Benim genel kural olduğunu istersem tutunacak bir nesne için bazı uzunluk zaman (eğer bir üye değişkeni bir sınıf, örneğin), o zaman lazım emin olmak için nesnenin başvuru sayısı hakkında bilgisi bana. Yukarıda açıklandığı gibi, bir nesnenin başvuru sayısı retain
arama artırılır. Kongre tarafından da bir nesne "" yöntemi. init ile oluşturulduğunda artan (1, gerçekten ayarlayın) Her iki durumda da, onunla işim bittiğinde nesne üzerinde release
aramak benim görevim. Eğer ben istemezsem eğer, bir bellek sızıntısı olacaktır.
Nesne oluşturma örneği:
NSString* s = [[NSString alloc] init]; // Ref count is 1
[s retain]; // Ref count is 2 - silly
// to do this after init
[s release]; // Ref count is back to 1
[s release]; // Ref count is 0, object is freed
autorelease
şimdi. Autorelease sistem bu nesne bir süre sonra serbest söylemek (ve bazen gerekli) uygun bir yol olarak kullanılır. autorelease
çağrıldığında tesisat bakış açısıyla, geçerli iş parçacığı NSAutoreleasePool
çağrı uyarılır. NSAutoreleasePool
şimdi bir fırsat (olay döngünün o anki adımını sonra) alır sonra, nesne üzerinde release
çağrı olduğunu bilir. Bizim açımızdan, gerek yok yani bizim için release
arama önemser, (ve aslında, bunu yapmamalıyız) olarak görür.
ÖNEMLİ NOT (tekrar, kongre tarafından) tüm yaratılış nesnesınıfyöntemleri autoreleased bir nesne döndürür. Örneğin, aşağıdaki örnekte, "s" 1, ama olay döngü tamamlandıktan sonra imha edilecek bir başvuru sayısı vardır. değişken
NSString* s = [NSString stringWithString:@"Hello World"];
Eğer bu dize üzerine asmak isterseniz, işiniz bittiğinde retain
açıkça, o açıkça release
aramak gerekir.
Kod çok yapmacık aşağıdaki biraz düşünün ve autorelease
gerekli olduğu bir durum görürsünüz.
- (NSString*)createHelloWorldString
{
NSString* s = [[NSString alloc] initWithString:@"Hello World"];
// Now what? We want to return s, but we've upped its reference count.
// The caller shouldn't be responsible for releasing it, since we're the
// ones that created it. If we call release, however, the reference
// count will hit zero and bad memory will be returned to the caller.
// The answer is to call autorelease before returning the string. By
// explicitly calling autorelease, we pass the responsibility for
// releasing the string on to the thread's NSAutoreleasePool, which will
// happen at some later time. The consequence is that the returned string
// will still be valid for the caller of this function.
return [s autorelease];
}
Bu biraz kafa karıştırıcı olduğunun farkındayım - bir noktada, ama, bunu tıklatın. İşte gidiyorsun almak için birkaç referanslar:
- Bellek yönetimi için Apple's introduction.
- Cocoa Programming for Mac OS X (4th Edition) Aaron tarafından Hillegas - harika örnekler, çok çok iyi yazılmış bir kitap. Bir öğretici gibi görünüyor.
- Eğer gerçekten dalış iseniz, Big Nerd Ranch baş edebilirsin. Burası bir eğitim merkezi Aaron Hillegas ile çalışma kitabın yazarı yukarıda. Kakao ders İntro orada birkaç yıl önce katıldım, ve öğrenmek için harika bir yol oldu.
Objective-C Kakao bir uygulama düzenli...
Kakao Yerine Objective-C ile C kullanm...
Nasıl bir kakao bir değişken önüne alt...
Neden hiçbir Başvuru Çöp Toplama Sayma...
Ne tür bir sızıntı otomatik referans O...