SORU
9 AĞUSTOS 2008, CUMARTESİ


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
9 AĞUSTOS 2008, CUMARTESİ


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Gavin Hoey

    Gavin Hoey

    21 Aralık 2007
  • InfoPuppet

    InfoPuppet

    15 Kasım 2011
  • Palmundo Ec

    Palmundo Ec

    11 HAZİRAN 2009