এক্সকোড 9-এ "এই ফাংশন ঘোষণাটি কোনও প্রোটোটাইপ নয়" warning


119

এক্সকোড 9 ব্যবহার করার সময়, কিছু সংকলক সতর্কতা বলছে This function declaration is not a prototype। এটি voidপদ্ধতির বডিটিতে যোগ করার পরামর্শ দেয় যা এটি সমাধান করবে। আমার যে সমস্যাটি হচ্ছে তা হ'ল সেই সতর্কতাগুলি সিস্টেম-এপিআই-এর মতো UIApplicationপ্রতিনিধি-পদ্ধতিগুলির জন্যও ফেলে দেওয়া হয়েছে :

- (void)application:(UIApplication *)application
    handleActionWithIdentifier:(NSString *)identifier
         forRemoteNotification:(NSDictionary *)userInfo
              withResponseInfo:(NSDictionary *)responseInfo
             completionHandler:(void (^)())completionHandler

এটি নিম্নলিখিত দ্বারা সমাধান করা যেতে পারে:

- (void)application:(UIApplication *)application
    handleActionWithIdentifier:(NSString *)identifier
         forRemoteNotification:(NSDictionary *)userInfo
              withResponseInfo:(NSDictionary *)responseInfo
             completionHandler:(void (^)(void))completionHandler

এখন আমি ভাবছি যে ডেলিগেট পদ্ধতিগুলি এখনও দীর্ঘমেয়াদে কাজ করবে বা অ্যাপল voidপরবর্তী আইওএস 11 বিটা সংস্করণে সন্নিবেশ করবে কিনা । আমি কৌতূহলী কারণ আমি যদি voidদেহটি অন্তর্ভুক্ত করি তবে এক্সকোড বিযুক্তি পদ্ধতি-নির্বাচকদের সম্পর্কে অভিযোগ করবে (যা বোঝায়)। কেউ কি এখনও পর্যন্ত একই সমস্যাটি অনুভব করেছেন?

উত্তর:


251

খালি বন্ধনী সহ ব্লক ঘোষণা:

void (^)()

খালি বন্ধনী সহ একটি ফাংশন পয়েন্টার হিসাবে একই শব্দার্থতত্ত্ব রয়েছে:

void (*)()

এর অর্থ এই নয় যে কোনও যুক্তি নেই। এর অর্থ হল যে আর্গুমেন্টগুলি নির্দিষ্ট করা হয়নি, তাই এটি বাগের পথটি খোলে যেহেতু আপনি এটি নিম্নলিখিত উপায়ে কল করতে পারেন:

void (^block)() = ...
block();
block(10);
block(@"myString");

কোনও পরামিতি ছাড়াই ব্লকগুলি ঘোষণা করার সময়, সর্বদা ব্যবহার করুন:

void (^)(void)

অ্যাপল সর্বত্র এটি সঠিকভাবে করছে না এবং উপযুক্ততার কারণে তারা সম্ভবত পুরানো এপিআইয়ের জন্য এটি ঠিক করছে না। আপনি নতুন এপিআইতে না যাওয়া পর্যন্ত আপনাকে সেই সতর্কতাটি সেখানে রাখতে হবে।

আপনি সেই সতর্কতাটি বন্ধও করতে পারেন ( -Wstrict-prototypes): এখানে চিত্র বর্ণনা লিখুন

বা ব্যবহার করে #pragma(ধন্যবাদ @ ডেভিডিসড্ক ):

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wstrict-prototypes"

- (void)application:(UIApplication *)application
handleActionWithIdentifier:(NSString *)identifier
forRemoteNotification:(NSDictionary *)userInfo
   withResponseInfo:(NSDictionary *)responseInfo
  completionHandler:(void (^)())completionHandler {

}
#pragma clang diagnostic pop

এখানে এলএলভিএম আলোচনা বা ওপেনডারে বাগটি দেখুন

নোট করুন যে এপিআইগুলির অভ্যন্তরীণ কাজের কোনও পরিবর্তন হয়নি, সমস্ত কোড এখনও কাজ করবে। আমরা কেবলমাত্র জানব যে API হিসাবে হওয়া উচিত ঠিক তেমন ভাল নয়।


5
আইওএস এপিআই বাস্তবায়নের সময় আপনি সতর্কতা অপসারণ করতে প্রগমাস ব্যবহার করতে পারেন: # প্রগমা ক্ল্যাং ডায়াগোনস্টিক পুশ #pragma ক্ল্যাং ডায়াগোনস্টিক উপেক্ষা করা হয়েছে "-উস্ট্রিট-প্রোটোটাইপস" - (শূন্য) অ্যাপ্লিকেশন: (ইউআইএপ্লিকেশন *) অ্যাপ্লিকেশন হ্যান্ডেলঅ্যাকশনউইথ্টিফায়ারকারী: (এনএসএসটিং *) সনাক্তকারী জন্য রেমোটনোটিকেশন: (এনএসডেটওয়্যার *) ব্যবহারকারীগণ রেসপন্সআইফোন সহ: (এনএসডেটরিয় *) প্রতিক্রিয়াপ্রাপ্তি হ্যান্ডলার: (অকার্যকর (^) ()) সমাপ্তি
হ্যান্ডলার

1
জেবিসিয়ার্টভিউ এপিআইয়ের সাথে এগুলির সম্পর্কে প্রায় 20 টি সতর্কতা পেয়েছে। তারা সুইফট ৪-এ আপডেট করার সিদ্ধান্ত না দেওয়া পর্যন্ত এগুলি বন্ধ করে রাখতে সক্ষম
এডিসন

7
@tymac এটি একটি আপত্তি সতর্কতা। সুইফটের সাথে এর কোনও যোগসূত্র নেই।
সুলতান

> "কোনও পরামিতিবিহীন ব্লকগুলি ঘোষণা করার সময়, সর্বদা (অকার্যকর) ব্যবহার করুন" <কোডে দেখতে দেখতে এমনটি কী যুক্ত করতে পারেন? বিকল্প হিসাবে void (^)()বাvoid (*)()
পেকম্ব

2
@pkamb স্রেফ আপনার ব্লকের কোনো পরামিতি (অর্থাত লাগবে না যখন void(^)()), স্পষ্টভাবে অন্তর্ভুক্ত voidবন্ধনীর মধ্যে: void(^)(void)
বেন স্টক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.