আইফোনে অবজেক্টিভ-সি সহ পদ্ধতির নাম এনএসলোগ


153

বর্তমানে আমরা শ্রেণীর নাম এবং লগের উত্স লাইন নম্বর প্রিন্ট করতে একটি বর্ধিত লগ প্রক্রিয়াটি নিজেরাই নির্ধারণ করছি।

#define NCLog(s, ...) NSLog(@"<%@:%d> %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], \
    __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__])

উদাহরণস্বরূপ, যখন আমি এনসিএলগকে কল করি (@ "হ্যালো ওয়ার্ল্ড"); আউটপুটটি হবে:

<ApplicationDelegate:10>Hello world

এখন আমি পদ্ধতির নামটিও লগ আউট করতে চাই:

<ApplicationDelegate:applicationDidFinishLaunching:10>Hello world

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


আমার শেষ iPhoneপ্রকল্পে, আমি আসলে এটি ম্যানুয়ালি করেছি। এর উত্তর দেখতে ভাল লাগবে।
জ্যাকব রিলকিন

সম্ভাব্য অনুরূপ: stackoverflow.com/questions/969130/...
erkanyildiz

উত্তর:


261
print(__FUNCTION__) // Swift
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C

3 এবং উপরে সুইফ্ট

print(#function)

120
আপনার সত্যই ব্যবহার করা উচিত NSLog(@"%@", NSStringFromSelector(_cmd)), আপনি যদি ব্যবহার করতে যাচ্ছেন _cmd, যেহেতু আফাইক অ্যাপল কোনও সি-স্ট্রিং নয়, _cmdপ্রকার হিসাবে ঘোষণা করেছে SEL। এটি কেবলমাত্র একটি সি-স্ট্রিং হিসাবে প্রয়োগ করা হয়েছে (ম্যাক ওএস এক্স এবং আইফোন ওএসের বর্তমান সংস্করণ হিসাবে) এর অর্থ এই নয় যে আপনার এটিকে সেভাবে ব্যবহার করা উচিত, যেহেতু অ্যাপল এটি কোনও ওএস আপডেটে পরিবর্তন করতে পারে।
নিক ফোর্জে

5
হ্যাঁ, এনএসএসস্ট্রিংফ্রোমস্লেেক্টর হ'ল আরও সঠিক উত্তর। আমি কখনও ডিবাগ কোড ব্যতীত সিআর স্ট্রিং হিসাবে _ সিএমডি ব্যবহার করি না।
ড্রোনওয়ার্ড

বাহ, সংকলক পয়েন্টার অসম্পূর্ণতা সম্পর্কে অভিযোগ করে, কিন্তু এটি কাজ করে ... সুতরাং _ সিএমডি (টাইপ: এসইএল) আসলেই একটি চর *!!?!
নিকোলাস মিয়ারি

3
পদ্ধতি কলগুলি যেমন [self doSomething:arg1 somethingElse:arg2]সি ফাংশন কলে রূপান্তরিত হয় objc_msgSend(self, "doSomething:somethingElse:, arg1, arg2);। এর দ্বিতীয় প্যারামিটারটি objc_msgSend()a char*। মনে রাখবেন যে ওজেক্টিভ-সি রানটাইমটি গতিশীল, তাই কোন শ্রেণিতে কোন চরকে কল করা উচিত তা কোন পদ্ধতিটি উপযোগী তা আবিষ্কার করার জন্য এটি সন্ধানের জন্য একটি টেবিল ব্যবহার করছে যেহেতু পদ্ধতিগুলি অনুসন্ধান সারণীতে স্ট্রিং হিসাবে প্রতিনিধিত্ব করা হয়।
জ্যাক লরেন্স 16

1
সুইফ্ট ২.২ এর জন্য ব্যবহার করা উচিতprint("\(#function)")
জেক লিন

161

প্রযুক্তিগতভাবে আপনার প্রশ্নের উত্তর দিতে, আপনি চান:

NSLog(@"<%@:%@:%d>", NSStringFromClass([self class]), NSStringFromSelector(_cmd), __LINE__);

অথবা আপনি এটি করতে পারেন:

NSLog(@"%s", __PRETTY_FUNCTION__);

2
এর সাথে __FUNCTION__এবং এর বেশিরভাগ সমতুল্যও সি-ফাংশনে উপলব্ধ।
জর্জি ফ্রিজচে

এনবি __FUNCTION__ক্লাসের নামও অন্তর্ভুক্ত করে
অরেঞ্জডগ

1
এনএসএলগ (@ "% s", _ফঙ্ক_ ) ব্যবহার করে কি কোনও পার্থক্য রয়েছে ; বা এনএসএলগ (@ "% s", _PRETTY_FUNCTION_ ) ???
রবি

82

TL; ড

NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );

বিস্তারিত

অ্যাপলের একটি প্রযুক্তিগত প্রশ্নোত্তর পৃষ্ঠা রয়েছে: QA1669 - আমি আমার লগিংয়ের বিবৃতিগুলিতে প্রাসঙ্গিক তথ্য - যেমন বর্তমান পদ্ধতি বা লাইন নম্বর - যুক্ত করতে পারি?

লগিংয়ে সহায়তা করার জন্য:

  • সি প্রিপ্রসেসর কয়েকটি ম্যাক্রোগুলি সরবরাহ করে
  • উদ্দেশ্য-সি এক্সপ্রেশন (পদ্ধতি) সরবরাহ করে।
    • বর্তমান পদ্ধতির নির্বাচকের জন্য অন্তর্নিহিত যুক্তিটি পাস করুন :_cmd

অন্যান্য উত্তরগুলি সূচিত হিসাবে, কেবলমাত্র বর্তমান পদ্ধতির নাম পেতে কল করুন:

NSStringFromSelector(_cmd)

বর্তমান পদ্ধতির নাম এবং বর্তমান লাইন নম্বর পেতে, এই দুটি ম্যাক্রো __func__এবং __LINE__এখানে দেখা হিসাবে ব্যবহার করুন:

NSLog(@"%s:%d someObject=%@", __func__, __LINE__, someObject);

আর একটি উদাহরণ… কোড স্নিপেটস আমি এক্সকোডের কোড স্নিপেট লাইব্রেরিতে রাখি:

NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );

… এবং ত্রুটির পরিবর্তে ট্র্যাক…

NSLog( @"TRACE %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );

… এবং একটি মান ( [rows count])) পাস করে একটি নরম কোডেড বিবরণ ব্যবহার করে আর একটি দীর্ঘ …

NSLog( @"TRACE %@ METHOD %s:%d.", [NSString stringWithFormat:@"'Table of Contents.txt' file's count of Linefeed-delimited rows: %u.", [rows count]] , __func__, __LINE__ );

লগিংয়ের জন্য প্রিপ্রসেসর ম্যাক্রো

ম্যাক্রোর উভয় পাশের জুড়ে আন্ডারস্কোর অক্ষরের এক জোড়া ব্যবহারের বিষয়টি লক্ষ্য করুন ।

| ম্যাক্রো | ফর্ম্যাট | বিবরণ
  __func__% s বর্তমান ফাংশন স্বাক্ষর
  __LINE__% d বর্তমান লাইন নম্বর
  __FILE__% s উত্স ফাইলের সম্পূর্ণ পথ
  __PRETTY_FUNCTION__% s __func__ এর মত, তবে ভার্জোজ অন্তর্ভুক্ত
                                    সি ++ কোডে তথ্য টাইপ করুন। 

লগিং জন্য অভিব্যক্তি

| অভিব্যক্তি | ফর্ম্যাট | বিবরণ
  এনএসএসস্ট্রিংফ্রোমস্লেক (_সিএমডি)% @ বর্তমান নির্বাচকের নাম
  NSStringFromClass ([স্ব শ্রেণি])% @ বর্তমান বস্তুর শ্রেণীর নাম
  [[এনএসএসটিং% @ উত্স কোড ফাইলের নাম
    stringWithUTF8String: __ FILE__]   
    lastPathComponent] 
  [এনএসটি স্ট্রেড কলস্ট্যাকসাইমবলস]% @ এনএসএরে স্ট্যাক ট্রেস

লগিং ফ্রেমওয়ার্ক

কিছু লগিং ফ্রেমওয়ার্ক বর্তমান পদ্ধতি বা লাইন নম্বর পাশাপাশি পেতে সহায়তা করতে পারে। আমি নিশ্চিত নই যেহেতু আমি জাভাতে একটি দুর্দান্ত লগিং কাঠামো ব্যবহার করেছি ( এসএলএফ 4 জে + লগব্যাক ) তবে কোকো নয়।

বিভিন্ন কোকো লগিং ফ্রেমওয়ার্কের লিঙ্কগুলির জন্য এই প্রশ্নটি দেখুন ।

নির্বাচক নাম

আপনার যদি সিলেক্টর ভেরিয়েবল (একটি এসইএল ) থাকে তবে এই কোডেক ব্লগ পোস্টের দ্বারা বর্ণিত হিসাবে আপনি দুটি পদ্ধতিতে এর পদ্ধতির নাম ("বার্তা") মুদ্রণ করতে পারেন :


2013-07-19 হিসাবে লিঙ্কযুক্ত অ্যাপল ডক পৃষ্ঠা থেকে এই তথ্য আঁকা। এই পৃষ্ঠাটি সর্বশেষে 2011-10-04 আপডেট করা হয়েছিল updated


1
সি এর জন্য, sel_getName(SEL)যেহেতু এসইএল একটি অস্বচ্ছ ধরণের এবং এটি সর্বদা এক নাও ব্যবহার করুনchar *
ইথান রিসর

8
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C
print(__FUNCTION__) // Swift

4
ভবিষ্যতে এই উত্তরটি জুড়ে আসা যে কোনও ব্যক্তির জন্য: এটি গৃহীত উত্তরের সমতুল্য, তবে যখন এই উত্তরটি পোস্ট করা হয়েছিল তখন স্বীকৃত উত্তরটি আলাদা ছিল (স্বীকৃত উত্তরটি 2014 সালে সম্পাদিত হয়েছিল)। আমি ভোট নেমে যাচ্ছিলাম, তবে একটি ছোট তদন্তের পরে পরিবর্তে ভোট দিয়েছে :)
ফ্রি-নাম

0

এটি আসলে ঠিক যেমন সহজ:

printf(_cmd);

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


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