2010-08-17 20 views
9

iPhone SDK 4.0'da, UIApplication, void(^)(void) türünde ikinci bir parametre gerektiren setKeepAliveTimeout: yeni bir yönteme sahiptir.Bu karet^sözdizimi, her iki tarafta da geçersiz nedir?

-(BOOL)setKeepAliveTimeout:(NSTimeInterval)timeout handler:(void(^)(void))keepAliveHandler 

tam ikinci parametrenin sözdizimi ne demektir ve ben onun içine geçebilir bir işlev/işleyici bildirmek nasıl? FWIW aşağıdaki

her anlamda ...

void SomeHandler(void) 
{ 
} 

cevap

23

Bu bir "blok" Apple Snow Leopard içinde C eklenen yeni bir özelliktir aradığını değil.

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html

Bloğu (gayrı “bloklar”) yapmak olduğunu, bir C uzatma, hem de Objective-C ve C++ vardır

Blok nesneleri Nesneleri: Çok daha fazla bilgi mevcut de Programcılar kendi kendine yeten iş birimlerini tanımlamak için kolay. Bloklar, geleneksel işlev göstergelerine benzer - ama çok daha güçlüdür. önemli farklılıklar açıklanmıştır:

Blokları olarak, satır içi tanımlanabilir Bloklar salt okunur Diğer dillerde yerel değişkenlerin kopyaları, benzer “kapanışları” Bu işlevsellik tür dinamik sık görülür yakalamak “anonim işlevlerin.” yorumlanmış diller, ancak daha önce C programcılarına daha önce hiç bulunmamıştı. Apple, MIT lisansı altında Açık Kaynak olarak hem Blok Diller Şartnamesi'ni hem de açık kaynak olarak uygulamamızı yayınladı, GCC 4.2 ve argoya blok desteği ekledi ve C programlama dilinin sonraki sürümünün bir parçası olarak değerlendirildi.

sözdizimi

bir blok değişken yerine bir yıldız (‘*’) 'in bir çıkıntı işareti (‘^’) dışında, bir işlev işaretçisi gibi görünüyor.

void (^my_block)(void); 
0

Fonksiyonlar aşağıdaki gibi maskelenebilir.

#if NS_BLOCKS_AVAILABLE 
- (void)foo; 
#endif 
İlgili konular