কোনও পদ্ধতি বিদ্যমান কিনা তা পরীক্ষা করে দেখুন


110

উদ্দেশ্য-সি-তে কোনও পদ্ধতি বিদ্যমান থাকলে আমি কী পরীক্ষা করতে পারি?

আমি আমার প্রহরীটিকে কল করার আগে এই পদ্ধতিটি আছে কিনা তা দেখার জন্য একজন প্রহরী যুক্ত করার চেষ্টা করছি।


প্রথমদিকে এটি সঠিক পদ্ধতির কিনা তা নিয়েও প্রশ্ন রয়েছে, যেহেতু উদ্দেশ্য-সি ক্লাসগুলি নির্বাচকদের প্রতিক্রিয়া জানাতে পারে যে তারা (মাধ্যমে - forwardInvocation:) ঘোষণা করেন নি ।
ডোনাল ফেলো

উত্তর:


189
if ([obj respondsToSelector:@selector(methodName:withEtc:)]) {
   [obj methodName:123 withEtc:456];
}

72

স্থিতিশীল বার্তার উদাহরণগুলিও রয়েছে রিসপন্ডটোসলেক্টর: (এসইএল) নির্বাচনকারী আপনি এটিকে ডাকবেন:

[MyClass instancesRespondToSelector:@selector(someMethod:withParams:)]

বা এই মত:

[[myObject class] instancesRespondToSelector:@selector(someMethod:withParams:)]

আপনি যদি কোনও কন্সট্রাক্টরকে কল করতে চান বা এটির উপর নির্ভর করে অন্য কোনওটিকে কল করতে চান (এটি উদাহরণস্বরূপ বলার আগে আমি বলতে চাই) এটি কার্যকর হতে পারে।


1
রেসপন্ডটোসলেক্টরের কাছ থেকে রেসপন্সটোসেক্টর থেকে আলাদা কী?
CReaTuS

1
মূল পার্থক্যটি হ'ল একটি হ'ল একটি উদাহরণ বার্তা (একটি নির্ধারিত উদাহরণ বার্তা উপস্থিত থাকলে তা পরীক্ষা করা) অন্যটি একটি শ্রেণীর বার্তা (একটি নির্ধারিত শ্রেণীর বার্তা উপস্থিত থাকলে তা পরীক্ষা করার জন্য)।
রিকার্ড পেরেজ দেল ক্যাম্পো

1
[মাইক্লাস উদাহরণস্বরূপ রিসপন্ডটোসিলিেক্টর] এর জন্য +1। আমার এটি একটি ডিগ্রি তৈরির পদ্ধতির অভ্যন্তরে প্রয়োজন: সাবক্লাসিং করার সময় অন্যের পরিবর্তে একটি সুপার থিম পদ্ধতি কল করা প্রয়োজন (অবহেলিত), যেহেতু স্ব স্ব তৈরি হয়নি এবং প্রতিক্রিয়াশীলতা সর্বদা কোনও নম্বর ফিরিয়ে দেবে না।
লাইটম্যান

12

ব্যবহার respondsToSelector:ডকুমেন্টেশন থেকে :

respondsToSelector:

একটি বুলিয়ান মান প্রদান করে যা নির্দেশ করে যে প্রাপক কোনও নির্দিষ্ট বার্তাকে প্রতিক্রিয়া জানাতে পারে এমন কোনও পদ্ধতি প্রয়োগ করে বা উত্তরাধিকারী কিনা।

- (BOOL)respondsToSelector:(SEL)aSelector

পরামিতি
aSelector - একটি নির্বাচক যা একটি বার্তা শনাক্ত করে।

ফেরত মান
YES যদি রিসিভার কার্যকরী বা অধিকারপ্রাপ্ত একটি পদ্ধতি যে উত্তর দিতে পারেন aSelector , অন্যথায় NO


10

আপনি প্রতিক্রিয়া খুঁজছেন টো নির্বাচনকারী: -

if ([foo respondsToSelector: @selector(bar)] {
  [foo bar];
}

ডোনাল যেমন উপরেরটি বলেছে তেমনি foo অবশ্যই বার নির্বাচনকারীকে গ্রহণ করতে পারে। তবে, foo যদি এমন কোনও প্রক্সি থাকে যা বারটির বার্তাটি প্রাপ্ত কিছু অন্তর্নিহিত বস্তুর কাছে বারকে ফরওয়ার্ড করে, তবে প্রতিক্রিয়াশক্তি নির্বাচন করুন: বার্তাটির প্রতিক্রিয়া ব্যক্তকারী কোনও বার্তায় বার্তা ফরোয়ার্ড করা সত্ত্বেও আপনাকে কিছু বলবে না।


1

প্রতিক্রিয়াশীলদের সাথে নির্বাচকদের চেক করা সাধারণত সাধারণত প্রতিনিধি পদ্ধতির জন্যই হয়। আপনার প্রতিনিধি পদ্ধতির জন্য ফরওয়ার্ড ইনভোকেশন বা প্রক্সিগুলি ব্যবহার করা উচিত নয়। যদি আপনাকে অন্যান্য পরিস্থিতিতে প্রতিক্রিয়াশক্তি নির্বাচন করতে হয় তবে আপনি নিশ্চিত করতে পারেন যে আপনার প্রোগ্রামটি ডিজাইনের আরও উপযুক্ত কোনও উপায় নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.