2011-06-29 23 views
9

Ben:Seçici yerine bir blok nesnesi mi kullanıyorsunuz?

[self schedule:@selector(tickhealth)]; 

Ve tickHealth yöntemi yalnızca bir kod satırı vardır:

-(void)tickHealth 
{ 
    [hm decreaseBars:0.5]; 
} 

mümkün olan bir seçicinin yerine blok nesneleri kullanmak. gibi örnek bir şey için: Caleb olarak

[self schedule:^{ 
    [hm decreaseBars:0.5]; 
}]; 

cevap

7

& bbum doğru basitçe mevcut (ve değişmeden) - (void)schedule:(SEL)selector; yöntemine bir blok geçemez dikkat çekti.

Bununla birlikte yapabilirsiniz: blok türünü tanımlayın

: O zaman bu gibi diyoruz

- (void)schedule:(ScheduleBlock)block { 
    //blocks get created on the stack, thus we need to declare ownership explicitly: 
    ScheduleBlock myBlock = [[block copy] autorelease]; 
    //... 
    myBlock(); 
} 

:

typedef void(^ScheduleBlock)(); 

Değişim schedule: yöntem buna benzer tanımlanacak

[self schedule:^{ 
    [hm decreaseBars:0.5]; 
}]; 
alırsınız Mike Ash tarafından derlenen

Daha Objective-C blok iyilik bloklarla kickstarted:

+0

Bu yöntem ve OP'nin yöntemi uyumsuz; SEL, bir blok ile aynı değildir. – bbum

+0

@bbum: Doğru, bu yüzden "Tanımla: zamanlama: metodu buna benzer:…" yazmıştım. Belki de açıklık için "yeniden tanımlamak" yazmalıydı. Düzeltildi. – Regexident

4

sadece geçemez Bir seçici yerine bir blok çünkü bu iki şeyin farklı tipleri vardır. Ancak, -schedule: yöntemi üzerinde denetiminiz varsa, bir seçicinin yerine bir bloğu kabul etmek ve kullanmak için kolayca değiştirebilirsiniz.

İlgili konular