2012-02-27 12 views

cevap

0

Çok basit bir şekilde ifade etmek gerekirse, NSInvocation bloklardan daha az güçlüdür. Yalnızca tek bir yöntemle tek bir yöntem çağrısını içine alır, oysa bloklar çok sayıda rasgele kod satırını sarabilir. Çok basit bir karenin bile, karenin kendisini yapacak olan bir sınıfın desteğini almadan bir çağrıyı kullanmak imkansızdır.

3

NSInvocation, daha sonra (veya şimdi) ve geçerli içeriğin dışında çalıştırılabilen isteğe bağlı parametrelerle (seçici kullanarak) bir nesnedir (seçiciyi kullanarak). Oynat). NSInvocation, tam olarak neye ihtiyacınız olduğunu seçerek kopyalayabilir/başvurabilir.

Bu blok, geçerli iş parçacığının içeriğinin bölümlerini ya da tümünü yakalayabilen gizli bir yerel işlev tanımıdır. Ayrıca, NSInvocation'dan daha kolay yapılandırmak daha kolaydır çünkü iş parçacığı (veya kapsam) yerel bağlamını otomatik olarak yakalar, kopyalar ve korur. Bloklar, fonksiyonlarınıza benzer şekilde, ikili büyüklüğünüzü hafifçe artırabilir. Yerel bağlamdan çıkarılırsa (ör. Bir bloğu kopyaladığınızda), bloklar daha fazla CPU zamanı ve bellek gerektirebilir - NSInvocation.

3

NSInvocation, bir ileti çağrısını kapsülleyen bir nesnedir: hedef nesne, seçici, argümanlar ve dönüş değeri. Bir blok, bir kod bölümünü ve bu bölüme giden programın durumu hakkında bazı bilgileri içeren bir nesnedir: özellikle çağrı yığındaki değişkenleri bloğun oluşturulmasına kadar kaydeder.

Her ikisi de açıkça geri arama olarak kullanılabilir: bir nesneye bir mesaj göndermek için bir çağrı kullanabilir veya bir işlev gibi bir blokun kodunu çalıştırabilirsiniz. Onlarda farklı olan şey, her durumda devleti taşıma şeklimizdir. Bir çağrıyla, mesajın göründüğü bağlamı temsil etmek için hedef nesneyi veya parametrelerden birine ihtiyacınız vardır. Bir blok ile, blok oluşturulduğunda bu bağlam otomatik olarak durumdan yakalanır.

+0

blok bir işlevdir? veya nesne? @Justin'in dediği gibi: blok gizli bir yerel işlev tanımıdır – holsety

+0

İkisi de :). Bir blok, bloğu oluşturduğunuz anda (daha fazla veya daha az) yığının kopyasıyla birlikte anonim bir işlevdir. Ayrıca bir Objective-C nesnesidir, böylece bloğun kopyalarını oluşturabilir ve daha sonra bu kopyaları serbest bırakabilirsiniz. Bloğu çalıştırdığınızda, gerçekten sadece işlevini çağırıyorsunuz demektir; çalışma zamanı da işlev girmeden önce bloğun yığını ayarlar. –

İlgili konular