आप एक NSInvocation
वस्तु के बाद से
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds
invocation:(NSInvocation *)invocation
repeats:(BOOL)repeats;
इसके बजाय, आप तर्क पारित करने के लिए अनुमति देगा;: NSTimer
विधि इस्तेमाल कर सकते हैं वह यह है कि
एक ऑब्जेक्टिव-सी संदेश स्थिर प्रदान की गई,, यह एक कार्रवाई एक वस्तु में बदल गया है: एक NSInvocation
वस्तु है, जैसा कि docs यह परिभाषित करते हैं।
- (void)timerFireMethod:(NSTimer*)theTimer
एक NSInvocation
आप लक्ष्य, चयनकर्ता, और तर्क है कि आप में से गुजरती हैं स्थापित करने के लिए अनुमति देता है::
एक चयनकर्ता का उपयोग करके एक NSTimer
वस्तु बनाने जबकि विधि जा रहा है की प्रारूप की आवश्यकता है
SEL selector = @selector(myMethod:setValue2:);
NSMethodSignature *signature = [MyObject instanceMethodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setSelector:selector];
NSString *str1 = @"someString";
NSString *str2 = @"someOtherString";
//The invocation object must retain its arguments
[str1 retain];
[str2 retain];
//Set the arguments
[invocation setTarget:targetInstance];
[invocation setArgument:&str1 atIndex:2];
[invocation setArgument:&str2 atIndex:3];
[NSTimer scheduledTimerWithTimeInterval:0.1 invocation:invocation repeats:YES];
कहाँ MyObject
वर्ग कि myMethod:setValue2:
घोषित कर दिया और पर कार्यान्वित किया जाता है है - instanceMethodSignatureForSelector:
एक सुविधा कामकाज है NSObject
पर घोषित किया गया है जो आपके लिए NSMethodSignature
ऑब्जेक्ट देता है, जिसे NSInvocation
पर पास किया जा सकता है।
ही, ध्यान दें करने के लिए, setArgument:atIndex:
साथ, सूचकांक तर्क विधि सूचकांक 2. पर चयनकर्ता शुरुआत के रूप में स्थापित किए गए दस्तावेज़ों से पारित होने के लिए के लिए:
सूचकांकों 0 और 1 छिपा तर्क स्वयं से संकेत मिलता है और क्रमशः _cmd; आपको इन मानों को सीधे सेट लक्ष्य के साथ सेट करना चाहिए: और सेट चयनकर्ता: विधियां।आम तौर पर किसी संदेश में पारित तर्कों के लिए सूचकांक 2 और अधिक का उपयोग करें।
स्रोत
2009-08-28 23:02:01
यह मेरा से बेहतर जवाब है। आपको अनावश्यक तरीकों से अपने कार्यान्वयन को प्रदूषित करने से बचने के लिए ऐसा करना चाहिए। –
ध्यान दें कि, 'str1' और 'str2' स्थिर रूप से आवंटित नहीं थे, आप उन्हें लीक करेंगे। 'एनएसटीमर 'को अपने आमंत्रण ऑब्जेक्ट में' -retainArguments' भेजने के रूप में दस्तावेज किया गया है, लेकिन यह आपके लिए आमंत्रण ऑब्जेक्ट को' -retainArguments' भेजने के लिए चोट नहीं पहुंचाएगा। समस्या स्वयं तर्कों को बरकरार रख रही है, फिर भी उन्हें बनाए रखने के लिए आमंत्रण बता रही है। अपने आप को आमंत्रण तर्कों को न रखें! आवेदक इसे संभाल लें - और, यहां, टाइमर इसे स्वयं संभाल दें। –
विधि हस्ताक्षर पुनर्प्राप्त करने में किए गए अनुसार 'targetInstance' की कक्षा को हार्डकोड न करें। यदि आप वास्तव में '+ instanceMethodSignatureForSelector:' का उपयोग करना चाहते हैं, तो आप '[[targetInstance class] instanceMethodSignatureForSelector: selector] 'का उपयोग कर सकते हैं, लेकिन यह अनावश्यक रूप से जटिल है - बस' [targetInstance methodSignatureForSelector: selector] 'का उपयोग करके विधि हस्ताक्षर के लिए ऑब्जेक्ट से पूछें। । –