没有办法自动内省传递给方法的值。即使在 DEBUG 构建中(优化器不碍事),任何编写代码自省的尝试都说 iVar 将非常复杂(您必须深入研究符号表,提取偏移量等,然后尝试并找到可能在试图抓住它们时被破坏的论点)。
所以,不,没有办法真正自动化。
不过,一般来说,任何这样的日志记录机制都会产生如此巨大的输出量,因此您最好创建(可能仅调试)既可配置又可高度调整到您的应用程序的日志记录。
您可以像这样传递参数(感谢@hoha 提供了更简单的版本)。
#import <Foundation/Foundation.h>
#define FooLog(fmt, ...) NSLog(@"(%s): %@", __PRETTY_FUNCTION__, ## __VA_ARGS__)
@interface Bob:NSObject
@end
@implementation Bob
- (void)yourUncle
{
FooLog(@"%@", self);
}
@end
int main(int argc, char *argv[]) {
@autoreleasepool {
NSString *w = @"World";
FooLog(@"Hello, %@!", w);
[[Bob new] yourUncle];
}
}
输出:
2013-09-02 10:51:49.447 Untitled[60967:507] (int main(int, char **)): Hello, World!
2013-09-02 10:51:49.453 Untitled[60967:507] (-[Bob yourUncle]): <Bob: 0x7fde8840a490>