現在、拡張ログメカニズムを定義して、ログのクラス名とソース行番号を出力しています。
#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デバッガーもあることは知っていますが、時々、ログアウトしてデバッグしたいこともあります。
print(__FUNCTION__) // Swift
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C
Swift 3以降
print(#function)
技術的に質問に答えるには、次のものが必要です。
NSLog(@"<%@:%@:%d>", NSStringFromClass([self class]), NSStringFromSelector(_cmd), __LINE__);
または、次のこともできます。
NSLog(@"%s", __PRETTY_FUNCTION__);
_NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );
_
Appleには技術的なQ&Aページがあります: QA1669-現在のメソッドや行番号などのコンテキスト情報をロギングステートメントに追加するにはどうすればよいですか?
ロギングを支援するには:
_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つの方法のいずれかでメソッド名( "メッセージ")を出力できます- コーデックブログ投稿 :
NSLog(@"%@", NSStringFromSelector(selector) );
NSLog(@"%s", selector );
この情報は、リンクされたApple docページから2013-07-19の時点で描画されました。そのページは2011-10-04に最後に更新されました。
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C
print(__FUNCTION__) // Swift
実際には次のように簡単です。
printf(_cmd);
何らかの理由で、iOSでは、_cmdをリテラルの文字として渡すこともできますが、コンパイルの警告さえありません。知るか
In Swift 4:
func test(){
print(#function)
}
test()//値「test()」を出力