2011-06-29 14 views
9

मेरे पास है:एक चयनकर्ता के बजाय ब्लॉक ऑब्जेक्ट का उपयोग करना?

[self schedule:@selector(tickhealth)]; 

और tickHealth विधि केवल कोड की एक पंक्ति है:

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

यह संभव है एक चयनकर्ता के स्थान पर ब्लॉक वस्तुओं का उपयोग करें। जैसे उदाहरण के लिए कुछ:

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

उत्तर

7

कालेब के रूप में & bbum सही ढंग से बताया तो आप बस अपने मौजूदा (और नहीं बदला गया) - (void)schedule:(SEL)selector; विधि करने के लिए एक ब्लॉक पारित नहीं कर सकते हैं।

आप फिर भी यह कर सकते हैं:

परिभाषित ब्लॉक प्रकार:

typedef void(^ScheduleBlock)(); 

बदलें schedule: विधि इस के समान परिभाषित किया जाना:

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

तो यह इस तरह कहते हैं:

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

इसके अलावा ऑब्जेक्टिव-सी ब्लॉक अच्छाई माइक ऐश द्वारा संकलित है कि आप मिल जाएगा ब्लॉक के साथ किकस्टार्ट:

+0

यह विधि और ओपी की विधि असंगत है; एक एसईएल एक ब्लॉक के समान नहीं है। – bbum

+0

@bbum: ठीक है, यही कारण है कि मैंने "परिभाषित करें" शेड्यूल लिखा था: 'इस तरह की विधि: ... "। स्पष्टता के लिए शायद "पुनः परिभाषित" लिखा जाना चाहिए था। सही किया। – Regexident

4

तुम बस पारित नहीं हो सकता एक चयनकर्ता के स्थान पर एक ब्लॉक क्योंकि उन दो चीजों के अलग-अलग प्रकार होते हैं। हालांकि, अगर आपके पास -schedule: विधि पर नियंत्रण है, तो आप इसे चयनकर्ता के स्थान पर ब्लॉक को स्वीकार करने और उपयोग करने के लिए आसानी से संशोधित कर सकते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे