রিলিজ আবেদনের আগে আমার কী এনএসএলগ অক্ষম করা দরকার?


117

আইফোনের জন্য কোনও অ্যাপ প্রকাশ করার সময়, আমি যদি অক্ষম করি তবে কী NSLog();এটি আরও ভাল সম্পাদন করবে?


1
আমার বর্তমান প্রকল্পে আমি ইউএলওগার ব্যবহার করি । এটি প্রযোজনায় লগ করে না , যদি আপনি স্পষ্টভাবে এটি জিজ্ঞাসা করেন না। প্লেইন এনএসএলগের মতো অন্যান্য সুবিধাগুলি রয়েছে যেমন তীব্রতার মাত্রা ( ডিইবিইউজি , ইনফো এবং ইত্যাদি) বাক্সের বাইরে। ভাল করেছ!
আন্তন গায়েঙ্কো

1
আপনার প্রশ্নের উত্তর দেওয়ার জন্য "এটি কি আরও ভাল সম্পাদন করবে?" হ্যাঁ এটি করে, তবে আপনি যে ফলন পান তা নির্ভর করে NSLog()আপনার অ্যাপ্লিকেশন জুড়ে কতটি রয়েছে on NSLog()কার্যকর করতে সময় নেয় এবং আপনার অ্যাপ্লিকেশনটির রানটাইমে অতিরিক্ত ওভারহেড যুক্ত করে। যাইহোক, যদি এটি একটি সাধারণ ডিইবিইউজি প্রিপ্রসেসর ম্যাক্রো দিয়ে পারফরম্যান্সে সহায়তা করে তবে আমাদের এটি অক্ষম করা উচিত।
স্কট

আমি আপনাকেও পরামর্শ দেব যদি আপনার কোডে প্রচুর এনএসএলগ / মুদ্রণ বিবৃতি থাকে তবে এটি আপনাকে ডিবাগারটি সম্পর্কে আরও কিছুটা শেখার জন্য পরামর্শ দিতে পারে। আমি নিয়মিত ব্রেকপয়েন্টগুলি সেট করি যা আমার আগ্রহী মুদ্রণের তথ্য এবং স্বয়ংক্রিয়ভাবে চালিয়ে যায়। হ্যাঁ, এটি চলমানটিকে কিছুটা কমিয়ে দিতে পারে তবে বেশিরভাগ ক্ষেত্রে এটি অপ্রতিরোধ্য নয়। এছাড়াও, শর্তাধীন বিরতি যাতে অনাকাঙ্ক্ষিত কিছু ঘটলে আপনি তদন্ত করতে পারেন।
bshirley

উত্তর:


127

এটি করার একটি উপায় হ'ল আপনার বিল্ড সেটিংসে যাওয়া এবং ডিবাগ কনফিগারেশনের অধীনে "প্রিপ্রসেসর ম্যাক্রোস" এর মান যেমন:

DEBUG_MODE=1

নিশ্চিত করুন যে আপনি এটি কেবল ডিবাগ কনফিগারেশনের জন্যই করেছেন, বিটা বা প্রকাশ সংস্করণের জন্য নয়। তারপরে একটি সাধারণ হেডার ফাইলে আপনি এমন কিছু করতে পারেন:

#ifdef DEBUG_MODE
#define DLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
#define DLog( s, ... ) 
#endif

পরিবর্তে এখন সর্বত্র NSLog ব্যবহার করুন DLog। পরীক্ষা এবং ডিবাগ করার সময়, আপনি ডিবাগ বার্তা পাবেন। আপনি যখন কোনও বিটা বা চূড়ান্ত প্রকাশের জন্য প্রস্তুত হন, তখন সমস্ত DLogলাইন স্বয়ংক্রিয়ভাবে খালি হয়ে যায় এবং কোনও কিছুই নির্গত হয় না। এই পদ্ধতিতে ভেরিয়েবলগুলির কোনও ম্যানুয়াল সেটিং বা NSLogsপ্রয়োজনীয় মন্তব্য করার কোনও উপায় নেই । আপনার বিল্ড টার্গেটটি বাছাই করা এটির যত্ন নেয়।


এক্সকোড ৪.৫ এ এটি একটি সতর্কবাণী দেয় যা বলে যে: "ফাংশন 'ডিএলগ'-এর অন্তর্নিহিত ঘোষণা C99 এ অবৈধ" তাই এই জিনিসটি কাজ করে না।
সের্গে গ্রিসিওভ

2
@ সার্জিয়াসজি: যদি কার্যটির জন্য ঘোষণাটি না পাওয়া যায় তবে আপনি নিষ্ক্রিয় ঘোষণার সতর্কতা পেয়েছেন, এমন ক্ষেত্রে এটি মনে করে যে আপনি এটি ঘোষণার চেষ্টা করছেন। এটি নিশ্চিত করা হয়েছে যেখানে আপনার শ্রেণীর শিরোনাম ফাইলটিতে অ্যাক্সেস রয়েছে তা নিশ্চিত করুন।
sudo rm -rf

1
আইডিতে লগ আউট নেওয়া হয় না কারণ এটি ব্যবহারকারীদের থেকে আরও ভাল ত্রুটি প্রতিবেদন পাওয়ার ক্ষমতা হ্রাস করে। পারফরম্যান্স হিট প্রায় শূন্যে সীমাবদ্ধ করতে অ্যাসিঙ্ক লগিং এবং লগ-লেভেল ব্যবহার করুন! (কোকো
লম্বারজ্যাক

2
আমি #ifdef এর পরিবর্তে # আইফিকে নিয়ে যাব, কারণ DEBUG_MODE 0 এখনও সত্য পথে যাবে
গ্রেডি প্লেয়ার

1
এটি প্রশ্নের উত্তর দেয় না
মার্টিন ম্লোস্টেক

117

এক্সকোড 5 এবং আইওএস 7 এর জন্য আপডেট

দ্রষ্টব্য: একটি রিলিজ বিল্ডে মুদ্রণ () বিবৃতি মুছে ফেলার জন্য একটি এক্সকোড 7 / সুইফট 2.1 সমাধানের জন্য , আমার উত্তরটি এখানে সন্ধান করুন

হ্যাঁ, আপনার প্রকাশের কোডে আপনার কোনও এনএসএলগ বিবৃতি অপসারণ করা উচিত, কারণ এটি কেবল আপনার কোডকে ধীর করে দেয় এবং এটি কোনও প্রকাশ সংস্করণে ব্যবহার করে না। ভাগ্যক্রমে, এক্সকোড 5 (আইওএস 7) এ, রিলিজ বিল্ডগুলিতে আপনার সমস্ত এনএসএলগ বিবৃতি 'স্বয়ংক্রিয়ভাবে' অপসারণ করা আশ্চর্যরকম সহজ। সুতরাং কেন এটি না।

প্রথমে 3 টি পদক্ষেপ নিতে হবে, তারপরে কিছু ব্যাখ্যা

1) আপনার এক্সকোড প্রকল্পে, 'yourProjectName-prefix.pch' ফাইলটি সনাক্ত করুন (সাধারণত আপনি এটি 'সমর্থিত ফাইলগুলি' গোষ্ঠীর অধীনে পাবেন যেখানে আপনার মেইন.এম ফাইলটি অবস্থিত

2) '.pch' ফাইলের শেষে এই 3 টি লাইন যুক্ত করুন:

#ifndef DEBUG
   #define NSLog(...);
#endif

3) আপনার 'ডিবাগ' এবং 'রিলিজ' সংস্করণের মধ্যে পার্থক্য পরীক্ষা করুন। এটি করার একটি উপায় হ'ল 'সম্পাদনা স্কিম' -> 'অ্যাপ্লিকেশন নাম চালান' -> ট্যাবের অধীনে 'তথ্য' ডিবাগ এবং রিলিজের মধ্যে ড্রপ-ডাউন বাক্স ব্যবহার করে নির্বাচন করুন। রিলিজ সংস্করণে আপনি ডিবাগ কনসোলে কোনও এনএসএলগ আউটপুট দেখতে পাবেন না!

এই সব কিভাবে কাজ করে?

প্রথমত, একজনকে অবশ্যই জেনে রাখা উচিত যে একটি প্রিপ্রেসেসর তুলনামূলকভাবে 'বোবা' এবং সংকলকটি কল করার আগে কেবল একটি 'টেক্সট রিপ্লেসার' হিসাবে কাজ করে। এটি #defineবিবৃতি অনুসরণ করে যা কিছু আপনি '# সংজ্ঞায়িত' করে প্রতিস্থাপন করে ।

#define NSLog(...);

(...)বন্ধনীর মধ্যে 'কিছু' () জন্য দাঁড়িয়েছে। মনও ;শেষে। এটি কঠোরভাবে প্রয়োজনীয় নয় কারণ সংকলকটি এটিকে অপ্টিমাইজ করবে, তবে আমি এটি সেখানে রাখতে চাই, কারণ এটি আরও 'সঠিক'। আমাদের পরে #defineতাই প্রাক প্রসেসর 'কিছুই' সঙ্গে এটি প্রতিস্থাপন করবে, এবং তাই এটা শুধু সম্পূর্ণ লাইন বর্জন করা হবে, থেকে শুরু, 'কিছুই' হল NSLog...পর্যন্ত এবং সহ ;

সংজ্ঞায়িত বিবৃতিগুলি #ifdef(যদি সংজ্ঞায়িত হয়) বা #ifndef(সংজ্ঞায়িত না হয়) ব্যবহার করে শর্তযুক্ত করা যায়

এখানে আমরা লিখছি #ifndef DEBUG, যার অর্থ 'যদি প্রতীকটি DEBUG সংজ্ঞায়িত না হয়'। #ifdefঅথবা #ifndefহতে প্রয়োজন সঙ্গে 'বন্ধ'#endif

ডি-বিল্ড মোডটি যখন 'ডিইবিইউজি' হয় তখন এক্সকোড 5 ডিফল্টরূপে আমাদের জন্য 'ডিইবিইউজি' প্রতীকটি সংজ্ঞায়িত করে। 'রিলিজ' এ এটি সংজ্ঞায়িত করা হয়নি। আপনি এটি আপনার প্রকল্প সেটিংসের অধীনে যাচাই করতে পারেন, ট্যাব 'বিল্ড সেটিংস' -> 'অ্যাপল এলএলভিএম 5.0 - প্রিপ্রোসেসিং' -> প্রিপ্রসেসর ম্যাক্রোস বিভাগে স্ক্রোল করুন। আপনি দেখতে পাবেন যে প্রতীকটি 'ডিবিইউজি' রিলিজ বিল্ডগুলির জন্য সংজ্ঞায়িত করা হয়নি!

অবশেষে .pch ফাইলটি Xcode দ্বারা স্বয়ংক্রিয়ভাবে তৈরি হয় এবং সংকলনের সময় স্বয়ংক্রিয়ভাবে প্রতিটি উত্স ফাইলে অন্তর্ভুক্ত হয়। সুতরাং এটি মনে হয় আপনি #defineসম্পূর্ণরূপে আপনার প্রতিটি উত্স ফাইলের মধ্যে রাখতেন ।


1
ধন্যবাদ @ ওয়াশসাহাহাহ, এটি দুর্দান্ত কাজ করে। লগ বিবৃতিতে কোড স্থাপন এড়াতে সাবধান! প্রিপ্রসেসর ভিতরে থাকা বিষয়টিকে উপেক্ষা করে পুরো বিবৃতি সরিয়ে ফেলবেNSLog
এরিক প্লাটন

1
যদি এটি কোনও পুরানো প্রকল্প যা প্রিপ্রসেসর ম্যাক্রোগুলিতে ডিবাগ পতাকা না পেয়ে থাকে তবে এটি প্রকল্পের জন্য "ডিবাগ = 1" যোগ করতে
লক্ষ্যযুক্ত

1
এছাড়াও, NSLogif(AllCool) NSLog(@"Cool!Do Nothing!"); else...NSLogif(AllCool) {NSLog(@"Cool!Do Nothing!");} else...
ডু অং

33

উপরোক্ত প্রায় সমস্ত উত্তরই একটি সমাধানের সমাধান করে তবে সমস্যাটি ব্যাখ্যা করে না। আমি গুগলে অনুসন্ধান করেছি এবং এর কারণ খুঁজে পেয়েছি। আমার উত্তর এখানে:

হ্যাঁ, আপনি যদি আপনার রিলিজ সংস্করণে এনএসএলগকে মন্তব্য করেন তবে পারফরম্যান্স আরও ভাল হয়ে উঠবে। কারণ এনএসলগ বেশ ধীর। কেন? এনএসলগ দুটি জিনিস করবে 1) অ্যাপল সিস্টেম লগিং (এএসএল) এ লগ বার্তা লিখুন, 2) অ্যাপ্লিকেশনটি যদি এক্সকোডে চালিত হয় তবে এটি স্ট্যাডারেও লিখবে।

প্রথম সমস্যাটি প্রথমটিতে রয়েছে। থ্রেড নিরাপদ অর্জনের জন্য, এনএসএলগকে যতবার ডাকা হয়, এটি এএসএল সুবিধার সাথে একটি সংযোগ খোলে , বার্তা পাঠায় এবং সংযোগটি বন্ধ করে দেয়। সংযোগ অপারেশন খুব ব্যয়বহুল। আর একটি কারণ হ'ল এনএসলগ লগ করার টাইমস্ট্যাম্প পেতে কিছুটা সময় ব্যয় করে।

এখান থেকে রেফারেন্স ।


23

আমার ব্যক্তিগত প্রিয়টি হ'ল ভ্যারিয়েডিক ম্যাক্রো ব্যবহার করা।

#ifdef NDEBUG
    #define NSLog(...) /* suppress NSLog when in release mode */
#endif

1
তুমি কোথায় রেখেছ?
ব্যবহারকারী 6631314

20

সমস্ত লোক যারা বিজ্ঞতার সাথে মন্তব্য করেছিলেন যে NSLog()উত্পাদনে ফোন করা মোটেও দ্রুত গতিতে চলে না, আমি এটি যুক্ত করব:

এই সমস্ত NSLog()আউটপুট স্ট্রিং যে কেউ স্টোর থেকে আপনার অ্যাপ্লিকেশনটি ডাউনলোড করে এবং ম্যাক চলমান এক্সকোডে ( ডিভাইসটি অর্গানাইজার উইন্ডো দিয়ে) প্লাগ ইন করে ডিভাইসটি দিয়ে চালিত করে তার পক্ষে এটি দৃশ্যমান

আপনি কোন তথ্য লগ করছেন তার উপর নির্ভর করে (এবং বিশেষত যদি আপনার অ্যাপ্লিকেশন কোনও সার্ভারের সাথে যোগাযোগ করে, প্রমাণীকরণ করে ইত্যাদি), এটি একটি গুরুতর সুরক্ষা সমস্যা হতে পারে


তথ্যের জন্য ধন্যবাদ - এটি ডকটিতে কোথাও রয়েছে, বা সন্ধান করেছেন যে আপনি নিজেই? এটি এখনও সুইফটে মুদ্রণের জন্য সত্য?
রনি ওয়েবার্স

আমার কোনও ডকুমেন্টেশন পড়ার কথা মনে নেই। আমি সবেমাত্র আমার ডিভাইসে আমার সংরক্ষণাগারবদ্ধ বিল্ড (একই বাইনারি স্টোরটিতে জমা দিয়েছি) ইনস্টল করেছি এবং এটিকে Xcode এ প্লাগ করেছি। এটি যদি সুইফটের জন্য একই হয় তবে আমার কোনও ধারণা নেই print(), তবে সম্ভবত এটি সম্ভবত।
নিকোলাস মিয়ারি

@ নিকোলাসমিয়ারি @ Xcode এ প্লাগ করে বলতে কী বোঝ? আমরা কীভাবে আমাদের বাইনারিগুলিকে এক্সকোডে প্লাগ করতে পারি, আসলে আমি একই চেষ্টা করতে চাই। সুতরাং দয়া করে পরামর্শ দিন। ধন্যবাদ।
iDevAmit

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

3
@ ওয়াশসাহাহ প্রিন্ট ডিভাইস কনসোলে আউটপুট আউট করে না..আমি কেবল পরীক্ষা করে
দেখেছি

13

প্রকল্পের ডিফল্ট সেটিং

এক্সকোডে প্রকল্পের বর্তমান ডিফল্ট সেটিংসের অভ্যন্তরে, NS_BLOCK_ASSERTIONSম্যাক্রোটি রিলিজ সংস্করণে এবং DEBUG=1ডিবাগ সংস্করণে 1 এ সেট করা হবে ।

সুতরাং, আমি নিম্নলিখিত পদ্ধতিটি পছন্দ করি।

// NS_BLOCK_ASSERTIONS is defined by default, as shown in the screenshot above.
// Or, you can define yourself Flags in the `Other C Flags` -> `Release`.
#ifndef NS_BLOCK_ASSERTIONS
    #define _DEBUG
#endif

#ifdef _DEBUG
// for debug mode 
#define DLog(fmt,...) NSLog(@"%s " fmt, __FUNCTION, ##__VA_ARGS__) 
... /// something extra
#else
// for release mode
#define DLog(fmt,...) /* throw it away */
... /// something extra
#endif

5

হ্যাঁ, আপনার এটি অক্ষম করা উচিত। বিশেষত যদি আপনি নিজের কোডটির গতি সর্বাধিক করার চেষ্টা করছেন। এনএসলগিং জিনিসগুলি বাম এবং ডানগুলি সিস্টেম লগকে দূষিত করে যা অন্য বিকাশকারীরা এটি খননের চেষ্টা করছেন এবং এটি স্পিড-ক্রিটিকাল কোডের উপর বড় প্রভাব ফেলতে পারে (লুপগুলির অভ্যন্তরে accident "30% গতি বৃদ্ধি!" নিয়ে একটি আপডেট প্রকাশ পেয়েছে! কিছু সপ্তাহ পর... ;-)


5

সমস্ত ভাল উত্তর, তবে আপনি এখানে ব্যবহার করতে পারেন এমন আরও একটি ছোট কৌশল যা মূলত আপনার অ্যাপ্লিকেশনটির বিকাশ / পরীক্ষার পর্যায়গুলিতে consider

এটি অ্যাপ রিলিজ কোডের জন্যও কার্যকর হতে পারে, যদি আপনি কেবল আপনার ডিবাগ কোডটি চালু করতে চান এবং এমন বার্তা নয় যা আপনার কোডের প্রত্যক্ষ নিয়ন্ত্রণের বাইরে সমস্যাগুলি নির্দেশ করতে পারে।

শিল্প খাত:

আপনি .m ফাইলের শীর্ষে অনুসরণ করা লাইনটি অন্তর্ভুক্ত করে প্রতি মি। এন ফাইল প্রতি এনএসএলগ বন্ধ করতে পারেন :

#define NSLog(...)

( উল্লেখ্য: না না এই জ ফাইল শুধুমাত্র .m ফাইল করা! )

এটি কেবল NSLog()পরিবর্তে আপনার প্রিপ্রসেসর ম্যাক্রো প্রসারিত করে সংকলককে মূল্যায়ন করে। ম্যাক্রো যুক্তি ফেলা ছাড়া কিছুই করে না।

আপনি যদি এটি আবার চালু করতে চান তবে আপনি সর্বদা ব্যবহার করতে পারেন

#undef NSLog

উদাহরণস্বরূপ আপনি কিছু নির্দিষ্ট পদ্ধতির মাধ্যমে এনএসএলগের কাছে কল করতে পারেন something

#define NSLog(...)
-(void) myProblematicMethodThatSometimesNeedsDebugging {
    ...
}
#undef NSLog

3

এনএসলগ ধীর গতির এবং মুক্তির বিল্ডগুলির জন্য ব্যবহার করা উচিত নয়। নীচের মত একটি সাধারণ ম্যাক্রো এটির সাথে অক্ষম করা উচিত আপনার যে কোনও দাবিতে অক্ষম করবে। আপনি যে রিলিজ বিল্ডে এনএসএলগ চান সেখানে খুব কম ক্ষেত্রে কেবল সরাসরি এটি কল করুন। আপনার "অন্যান্য সি পতাকা" বিল্ড সেটিংসে "-DNDEBUG" যুক্ত করতে ভুলবেন না।

#ifdef NDEBUG
#define MYLog(f, ...) 
#else
#define MYLog(f, ...) NSLog(f, ## __VA_ARGS__)
#endif


0

এই সম্পর্কে কি?

#ifndef DEBUG_MODE
        fclose(stderr);     // the simplest way to disable output from NSLog
#endif    

1
এটি আউটপুটটি অক্ষম করে, তবে কোনও প্রসেসিংয়ের সময় বাঁচায় না, যেমন
এনএসলগকে

0
var showDebugLogs = false;

    func DLog(format: String, args: CVarArgType...) {
        if showDebugLogs{
        println(String(format: format, arguments: args))
        }
    }

এটি অতিরিক্ত আর্গুমেন্টগুলিও গ্রহণ করবে .. আপনার প্রয়োজন অনুসারে শুধু শোডাব্যাগলগগুলি প্যারামিটার মানকে সত্য বা মিথ্যা হিসাবে মানাবে Just


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