আমি কীভাবে এক্সকোডের একটি "অব্যবহৃত পরিবর্তনশীল" সতর্কতা থেকে মুক্তি পেতে পারি?


98

অব্যবহৃত পরিবর্তনশীল সতর্কতাগুলি কেন ঘটে তা আমি ঠিক বুঝতে পারি। আমি তাদের সাধারণভাবে দমন করতে চাই না, কারণ বেশিরভাগ ক্ষেত্রে তারা অবিশ্বাস্যভাবে দরকারী। তবে নিম্নলিখিত (স্বীকৃত) কোডটি বিবেচনা করুন।

NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);

এক্সকোড রিপোর্ট করেছেন যে savedঅব্যবহৃত পরিবর্তনশীল, অবশ্যই যখন তা হয় না। আমি সন্দেহ করি এটি কারণ NSAssert1ম্যাক্রো। NS_BLOCK_ASSERTIONSম্যাক্রো হয় না সংজ্ঞায়িত, তাই উদ্দেশ্য সি গবেষকেরা স্পষ্টভাবে সক্ষম করা আছে।

যদিও এটি কোনওরকম ক্ষতি করে না, তবুও আমি এটি বিব্রতকর এবং বিরক্তিকর বলে মনে করি এবং আমি এটি দমন করতে চাই তবে কীভাবে এটি করব তা সম্পর্কে আমি নিশ্চিত নই। ভেরিয়েবলটি নিজেকে নির্ধারণ করা সংকলক সতর্কতা থেকে মুক্তি পেয়ে যায়, তবে আমি যদি এরকম কিছু উপস্থিত থাকে তবে আমি এটি "সঠিক" উপায়ে করব।

উত্তর:


108

এটি এখনও নতুন এলএলভিএম সংকলকটিতে সমর্থন করে কিনা তা সম্পর্কে আমি নিশ্চিত নই, তবে জিসিসির একটি "অব্যবহৃত" অ্যাট্রিবিউট রয়েছে যা আপনি এই সতর্কতাটি দমন করতে ব্যবহার করতে পারেন:

BOOL saved __attribute__((unused)) = [moc save:&error];

বিকল্পভাবে (এলএলভিএম উপরোক্ত সমর্থন না করে) ক্ষেত্রে আপনি ভেরিয়েবল ঘোষণাকে একটি পৃথক লাইনে বিভক্ত করতে পারেন, গ্যারান্টি দিয়েছিলেন যে ম্যাক্রো প্রসারিত হয় বা না সে ক্ষেত্রে ভেরিয়েবলটি "ব্যবহৃত" হবে:

BOOL saved = NO;
saved = [moc save:&error];

107

এক্সকোড ৪.৩.২ ব্যবহার করে এবং এটি কার্যকারী বলে মনে হয়েছে (কম লেখা)

BOOL saved __unused;

এটি আমার পক্ষে কাজ করে না, আমি একটি সতর্কতা পেয়েছি যে'saved' was marked as unused but was used
হিট সীমান্তগুলি

37

এক্সকোডে আপনি "অব্যবহৃত ভেরিয়েবলস" এর জন্য সতর্কতা সেট করতে পারেন। লক্ষ্যটির জন্য "বিল্ড সেটিংস" এ যান এবং "অব্যবহৃত" শব্দটি দিয়ে ফিল্টার করুন

এখানে একটি স্ক্রিন শট হয়: বিল্ড সেটিংসের স্ক্রিনশট

আমি আপনাকে কেবল এটি ডিবাগের জন্য পরিবর্তন করার পরামর্শ দিচ্ছি। এইভাবে আপনি আপনার প্রকাশ সংস্করণে কিছু মিস করবেন না।


37
গ্রেগরি বলেছিলেন যে প্রশ্নের যে অংশটি আপনি মিস করেছেন, "আমি সাধারণভাবে তাদের দমন করতে চাই না, কারণ তারা বেশিরভাগ ক্ষেত্রেই অবিশ্বাস্যভাবে দরকারী"?
শেরম পেন্ডলি 20 '21

8
@ শেরেমপেন্ডলি নির্বিশেষে, এটি এখনও কার্যকর, এটি বিশ্বব্যাপী কীভাবে এটি বন্ধ করতে হবে সে সম্পর্কে আমার প্রশ্নের উত্তর দিয়েছিল।
রাফিয়ান

9
সতর্কতা বন্ধ করা বাগগুলি মিস করার দুর্দান্ত উপায়। আমি অত্যন্ত বিরুদ্ধে সুপারিশ।
ওরিওন এলিজিল

4
@ ওরিওনিলেজিল - ভাল, হ্যাঁ এবং না। মিথ্যা ধনাত্মকতার সাথে সত্যিকারের ইন্টারফেসের সমস্যা রয়েছে। আপনি কোডটি লেখার সময় সতর্কতাটি ক্রমাগত পপ আপ হয় আপনি যদি কোডটির যে অংশটিতে ভেরিয়েবলটি ব্যবহার করেন সেই অংশটি না পেয়ে থাকেন। সময়ের সাথে সাথে, এটি আপনাকে সতর্কতা উপেক্ষা করার প্রশিক্ষণ দেবে যার অর্থ আপনি আরও গুরুত্বপূর্ণ ত্রুটি ভালভাবে মিস করতে পারেন। সক্রিয়ভাবে সম্পাদিত কোডের ব্লকগুলিতে ত্রুটিটি দমন করতে সক্ষম হওয়াই ভাল।
টেকজেন

হাই, আমি ঠিক না রাখলে এটি ঠিক আছে। তবে আমার সন্দেহ হ'ল: আমাকে ডিবাগ সেট করতে হবে এবং মুক্তি পাবে না কেবলমাত্র অব্যবহৃত পরিবর্তনশীল: না? যা আমি সেট করতে হবে। আমি যদি সম্পূর্ণভাবে কোনও সেট না করে রাখি, তবে এটি মুক্তির সময় কোনও ত্রুটি তৈরি করে না?
সৌম্য রঞ্জন

22
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)

এই মত চেষ্টা করুন। এটা আমার জন্য কাজ করছে। এটি আপনার পক্ষেও কাজ করবে।


এটি আমার পক্ষে কাজ করে না, আমি একটি সতর্কতা পেয়েছি যে'saved' was marked as unused but was used
হিথ সীমান্তগুলি

15

পরিবর্তনশীল হিসাবে ব্যবহৃত হিসাবে চিহ্নিত করার একমাত্র সহজ এবং বহনযোগ্য উপায় হ'ল এটি ব্যবহার করা।

BOOL saved = ...;
(void)saved; // now used

আপনি ইতিমধ্যে বর্ণিত সংকলক-নির্দিষ্ট এক্সটেনশানগুলির সাথে খুশি হতে পারেন।


4
আমি উপরে বর্ণিত কুরুচিপূর্ণ # প্রচারণার চেয়ে এটিকে পছন্দ করি।
northernman

4
আরে ভাই, সুন্দর টিপ
ডিমাজভা

14
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop

সূত্র


এটি সবচেয়ে পরিষ্কার পন্থা যেহেতু এটি # প্যাগাগমাসের মধ্যে কেবলমাত্র সতর্কতাটি অক্ষম করে
কর্নার

8

এটি ব্যবহার করে দেখুন: __অনুবিযুক্ত বৈশিষ্ট্য এক্সকোড 5 এ কাজ করে


5

আপনি "রিলিজ" এ "না" এলএলভিএম কম্পাইলার 2.0 সতর্কতা সেট করতে পারেনএখানে চিত্র বর্ণনা লিখুন


4

এটি আপনি সিতে এভাবেই করেন এবং তাই উদ্দেশ্য-সিও।

আপনার কাছে সতর্কতা সক্ষম করা না থাকলেও, প্রত্যাবর্তনের মানটিকে স্পষ্টভাবে উপেক্ষা করা হিসাবে চিহ্নিত করা সর্বদা একটি ভাল ধারণা। এটি অন্যান্য বিকাশকারীদেরও দেখায়, আপনি কেবল ফেরতের মানটি ভুলে যান নি - আপনি অবশ্যই এটিকে উপেক্ষা করার জন্য স্পষ্টভাবে বেছে নিয়েছেন।

(void)[moc save:&error];

সম্পাদনা: সংকলকগণ কাস্টগুলিকে ক্রেস্ট উপেক্ষা করে void, সুতরাং এটির কার্য সম্পাদনকে প্রভাবিত করা উচিত নয় - এটি কেবল একটি দুর্দান্ত পরিষ্কার মানব টীকা


নির্দিষ্ট প্রসঙ্গে আপনি সংকলনের উদ্দেশ্য-সি কোড পেতে এই হ্যাকটি ব্যবহার করতে হবে। ব্যবহার (void)হ'ল পরিষ্কার উপায়, ধন্যবাদ!
ড্যান রোজনস্টার্ক

1

এটি দুটি লাইন গ্রহণ করা। ঘোষণা এবং ডিফল্ট মান পৃথক করুন

BOOL enabled = NO;

// ...

BOOL enabled;

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