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



objective-c xcode (1)

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

void (^)()

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

void (*)()

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

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

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

void (^)(void)

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

আপনি সেই সতর্কতাটিও বন্ধ করতে পারেন ( -Wstrict-prototypes ):

অথবা #pragma @davidisdk ব্যবহার করে (ধন্যবাদ @davidisdk ):

#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

here এলএলভিএম আলোচনা বা openradar

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

https://code.i-harness.com

এক্সকোড 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

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





xcode9-beta