উত্তর:
মূলত পারফরম্যাসলেক্টর আপনাকে নির্বাচিতকে প্রদত্ত বস্তুতে কোন নির্বাচককে কল করতে ডায়নামিকভাবে নির্ধারণ করতে দেয়। অন্য কথায় রানটাইমের আগে নির্বাচককে নির্ধারণ করা দরকার না।
এগুলি সমতুল্য হলেও:
[anObject aMethod];
[anObject performSelector:@selector(aMethod)];
দ্বিতীয় ফর্মটি আপনাকে এটি করতে দেয়:
SEL aSelector = findTheAppropriateSelectorForTheCurrentSituation();
[anObject performSelector: aSelector];
আপনি বার্তা প্রেরণের আগে।
performSelector:
এমন কিছু যা আপনি সম্ভবত আপনার ক্লাসে লক্ষ্য-অ্যাকশন প্রয়োগ করলেই সম্ভব হয়। ভাইবোন performSelectorInBackground:withObject:
এবং performSelectorOnMainThread:withObject:waitUntilDone:
প্রায়শই আরও দরকারী। একটি ব্যাকগ্রাউন্ড থ্রেড তৈরি করার জন্য, এবং উল্লিখিত ব্যাকগ্রাউন্ড থ্রেড থেকে মূল থ্রেডে ফলাফলগুলি আবার কল করার জন্য।
performSelector
সতর্কতা সংকলন দমন করতে দরকারী। যদি আপনি জানেন যে পদ্ধতিটি বিদ্যমান রয়েছে (যেমন ব্যবহারের পরে respondsToSelector
) তবে এটি Xcode কে "প্রতিক্রিয়া জানাতে পারে না" বলতে বাধা দেবে your_selector
। সতর্কতার আসল কারণটি অনুসন্ধান করার পরিবর্তে এটি ব্যবহার করবেন না । ;)
এই প্রশ্নের খুব প্রাথমিক উদাহরণের জন্য,
[object doSomething];
[object performSelector:@selector(doSomething)];
যা হতে চলেছে তাতে কোনও পার্থক্য নেই। doSomething সিঙ্ক্রোনজ করে অবজেক্ট দ্বারা কার্যকর করা হবে। কেবলমাত্র "ডসোমিংথিং" একটি খুব সহজ পদ্ধতি, এটি কোনও কিছুই ফেরায় না এবং কোনও প্যারামিটারের প্রয়োজন হয় না।
এটি কি আরও কিছু জটিল ছিল, যেমন:
(void)doSomethingWithMyAge:(NSUInteger)age;
জিনিসগুলি জটিল হয়ে উঠবে, কারণ [অবজেক্টটি ডুসিংথিংথওয়াইথ মাইএজ: 42];
আর "পারফরমেসিলেক্টর" এর কোনও বৈকল্পিকের সাথে আর ডাকা যাবে না, কারণ পরামিতিগুলির সাথে সমস্ত বৈকল্পিক কেবলমাত্র বস্তুর পরামিতি গ্রহণ করে।
এখানে নির্বাচক হবেন "doSomethingWithMyAge:" তবে কোনও প্রচেষ্টা
[object performSelector:@selector(doSomethingWithMyAge:) withObject:42];
কেবল সংকলন করা হবে না। এনএসএনম্বারটি পাস করা: 42 এর পরিবর্তে @ (42) কোনওভাবেই সহায়তা করবে না, কারণ পদ্ধতিটি একটি মৌলিক সি প্রকারের প্রত্যাশা করে - কোনও বস্তু নয়।
এছাড়াও, 2 টি পরামিতি পর্যন্ত সঞ্চালনকারী বৈকল্পিক রয়েছে, আর নেই। যদিও পদ্ধতিগুলিতে অনেক সময় আরও অনেকগুলি পরামিতি থাকে।
আমি খুঁজে পেয়েছি যে পারফেক্টস সিলেক্টরের সিঙ্ক্রোনাস ভেরিয়েন্টগুলি:
- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
সর্বদা কোনও বস্তু ফিরিয়ে দিন, আমি একটি সাধারণ BOOL বা NSUIntegerও ফিরিয়ে দিতে সক্ষম হয়েছি এবং এটি কার্যকর হয়েছে।
পারফেক্টসলেক্টরের দুটি প্রধান ব্যবহারের মধ্যে একটি হল পূর্ববর্তী উত্তরে বর্ণিত হিসাবে আপনি যে পদ্ধতিটি কার্যকর করতে চান তার নাম গতিময়ভাবে রচনা করা। উদাহরণ স্বরূপ
SEL method = NSSelectorFromString([NSString stringWithFormat:@"doSomethingWithMy%@:", @"Age");
[object performSelector:method];
অন্য ব্যবহারটি হ'ল সংক্ষিপ্ত আকারে আপত্তি জানাতে একটি বার্তা প্রেরণ করা, এটি বর্তমান রান-লুপ পরে কার্যকর করা হবে। এর জন্য, আরও বেশ কয়েকটি পারফর্মস্লেেক্টর বৈকল্পিক রয়েছে।
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray *)modes;
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;
- (void)performSelector:(SEL)aSelector target:(id)target argument:(id)arg order:(NSUInteger)order modes:(NSArray *)modes;
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array;
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg;
(হ্যাঁ আমি এগুলি এনএসটিস্ট্রেড, এনএসরুনলুপ এবং এনএসবজেক্টের মতো কয়েকটি ফাউন্ডেশন শ্রেণির বিভাগ থেকে সংগ্রহ করেছি)
প্রতিটি ভেরিয়েন্টের নিজস্ব নিজস্ব আচরণ রয়েছে তবে সবগুলি কিছু মিলিয়ে ভাগ করে নেয় (কমপক্ষে ওয়েটউন্টিলডোন কোনও ক্ষেত্রে সেট করা থাকে না)। "পারফরমেন্সলেক্টর" কলটি তত্ক্ষণাত্ ফিরে আসত এবং আপত্তি করার বার্তাটি কিছু সময়ের পরে কেবল বর্তমান রানলুপে রাখা হবে।
বিলম্বিত কার্যকর হওয়ার কারণে - স্বাভাবিকভাবে কোনও নির্বাচনের পদ্ধতি অনুসারে কোনও রিটার্ন মান উপলব্ধ হয় না, সুতরাং এই সমস্ত অ্যাসিনক্রোনাস বৈকল্পিকগুলিতে - (অকার্যকর) ফেরতের মান value
আমি আশা করি আমি এটি কোনওভাবে কভার করেছি ...
@ennuikiller স্পট ইন রয়েছে। মূলত, গতিশীলভাবে উত্পন্ন নির্বাচিতরা যখন আপনি কোডটি সংকলন করবেন তখন যে পদ্ধতিটির নাম আপনি কল করবেন সেটির নামটি (এবং সাধারণত সম্ভবত সম্ভব নয়) জানেন না for
একটি মূল পার্থক্য হ'ল -performSelector:
এবং বন্ধুরা ( বহু-থ্রেডযুক্ত এবং বিলম্বিত রূপগুলি সহ ) কিছুটা সীমিত যে এগুলি 0-2 পরামিতি সহ পদ্ধতিগুলির সাথে ব্যবহারের জন্য ডিজাইন করা হয়েছে। উদাহরণস্বরূপ, -outlineView:toolTipForCell:rect:tableColumn:item:mouseLocation:
6 টি প্যারামিটারের সাথে কল করা এবং ফেরত দেওয়া NSString
বেশ অযৌক্তিক, এবং সরবরাহিত পদ্ধতির দ্বারা সমর্থিত নয়।
NSInvocation
অবজেক্ট ব্যবহার করতে হবে ।
performSelector:
এবং বন্ধুরা সকলেই বস্তুর যুক্তি গ্রহণ করে, যার অর্থ আপনি তাদের কল করতে ব্যবহার করতে পারবেন না (উদাহরণস্বরূপ) setAlphaValue:
, কারণ এটির যুক্তিটি ভাসমান।
নির্বাচকরা কিছুটা অন্য ভাষায় ফাংশন পয়েন্টারগুলির মতো হয়। সংকলনের সময় আপনি জানেন না যে রানটাইমে আপনি কী পদ্ধতিতে কল করতে চান You এছাড়াও, ফাংশন পয়েন্টারগুলির মতো, তারা কেবল অনুরোধের ক্রিয়া অংশটি encapsulate করে। যদি পদ্ধতিটির প্যারামিটার থাকে তবে আপনাকে সেগুলিও পাস করতে হবে।
একটি NSInvocation
ছাড়া এটি binds একসঙ্গে অধিক বিবরণের একটি অনুরূপ উদ্দেশ্য করে তোলে। এটি কেবল ক্রিয়া অংশকেই অন্তর্ভুক্ত করে না, এতে লক্ষ্য বস্তু এবং পরামিতিগুলিও অন্তর্ভুক্ত থাকে। আপনি যখন এখনই নয় ভবিষ্যতে নির্দিষ্ট পরামিতিগুলির সাথে কোনও নির্দিষ্ট অবজেক্টে কোনও পদ্ধতিতে কল করতে চান এটি দরকারী। আপনি একটি উপযুক্ত তৈরি করতে পারেন NSInvocation
এবং এটি পরে ফায়ার করতে পারেন ।
দুজনের মধ্যে আরও একটি সূক্ষ্ম পার্থক্য রয়েছে।
[object doSomething]; // is executed right away
[object performSelector:@selector(doSomething)]; // gets executed at the next runloop
অ্যাপল ডকুমেন্টেশন থেকে এখানে উদ্ধৃত অংশ
"সঞ্চালনকারী: উইল অবজেক্ট: আফ্রিকা: ডেলি: পরবর্তী থ্রেডে পরবর্তী রান লুপ চক্র চলাকালীন এবং একটি alচ্ছিক বিলম্ব সময়কালের পরে নির্দিষ্ট নির্বাচককে সম্পাদন করে Because কারণ এটি পরবর্তী রান লুপ চক্রটি নির্বাচক সঞ্চালনের জন্য অপেক্ষা করে, এই পদ্ধতিগুলি থেকে একটি স্বয়ংক্রিয় মিনি বিলম্ব সরবরাহ করে বর্তমানে সম্পাদনকারী কোড। একাধিক কাতারে নির্বাচিতরা ক্রমানুসারে একের পর এক সঞ্চালিত হয় ""
performSelector:withObject:afterDelay:
সেগুলি সম্পর্কে , তবে প্রশ্ন এবং আপনার স্নিপেট ব্যবহার করছে performSelector:
, যা সম্পূর্ণ ভিন্ন পদ্ধতি। এর জন্য দস্তাবেজগুলি থেকে: < performSelector:
aSelector
performSelector/performSelector:withObject/performSelector:withObject:afterDelay
সকলেই একই আচরণ করে যা ভুল ছিল।