web-dev-qa-db-ja.com

iPhoneのObjective-CでNSLogメソッド名

現在、拡張ログメカニズムを定義して、ログのクラス名とソース行番号を出力しています。

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

たとえば、NCLog(@ "Hello world");を呼び出すと、出力は次のようになります。

<ApplicationDelegate:10>Hello world

ここで、次のようなメソッド名もログアウトします。

<ApplicationDelegate:applicationDidFinishLaunching:10>Hello world

そのため、どのメソッドが呼び出されているかを知ることができれば、デバッグが容易になります。 Xcodeデバッガーもあることは知っていますが、時々、ログアウトしてデバッグしたいこともあります。

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

Swift 3以降

print(#function)
254
drawnonward

技術的に質問に答えるには、次のものが必要です。

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

または、次のこともできます。

NSLog(@"%s", __PRETTY_FUNCTION__);
158
Dave DeLong

tl; dr

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

詳細

Appleには技術的なQ&Aページがあります: QA1669-現在のメソッドや行番号などのコンテキスト情報をロギングステートメントに追加するにはどうすればよいですか?

ロギングを支援するには:

  • Cプリプロセッサは、いくつかのmacrosを提供します。
  • Objective-Cは、expressions(メソッド)を提供します。
    • 現在のメソッドのセレクターにimplicit argumentを渡します:__cmd_

他の回答が示したように、単に現在のメソッドの名前を取得するには、以下を呼び出します:

_NSStringFromSelector(_cmd)
_

現在のメソッド名and現在の行番号を取得するには、次の2つのマクロ___func___および___LINE___を使用します。

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

別の例…Xcodeのコードスニペットライブラリに保存するコードスニペット:

_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__に似ていますが、詳細を含みます
 C++コードのタイプ情報。 

ロギングの式

 |式|フォーマット|説明
 NSStringFromSelector(_cmd)%@現在のセレクタの名前
 NSStringFromClass([自己クラス])%@現在のオブジェクトのクラス名
 [[NSString%@ソースコードファイル名
 stringWithUTF8String:__ FILE__] 
 lastPathComponent] 
 [NSThread callStackSymbols]%@スタックトレースのNSArray 

ロギングフレームワーク

一部のロギングフレームワークは、現在のメソッドまたは行番号の取得にも役立つ場合があります。私は、Java( SLF4J + LogBack )で素晴らしいロギングフレームワークを使用しましたが、Cocoaでは使用していません。

さまざまなCocoaロギングフレームワークへのリンクについては、 この質問 を参照してください。

セレクターの名前

セレクター変数( [〜#〜] sel [〜#〜] )がある場合、このメソッドで説明されている2つの方法のいずれかでメソッド名( "メッセージ")を出力できます- コーデックブログ投稿

  • NSStringFromSelector :へのObjective-C呼び出しの使用
    NSLog(@"%@", NSStringFromSelector(selector) );
  • ストレートCの使用:
    NSLog(@"%s", selector );

この情報は、リンクされたApple docページから2013-07-19の時点で描画されました。そのページは2011-10-04に最後に更新されました。

78
Basil Bourque
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C
print(__FUNCTION__) // Swift
8
Huynh Inc

実際には次のように簡単です。

printf(_cmd);

何らかの理由で、iOSでは、_cmdをリテラルの文字として渡すこともできますが、コンパイルの警告さえありません。知るか

0
Albert Renshaw

In Swift 4:

func test(){

print(#function)

}

test()//値「test()」を出力

0
Ankit garg