我有下面的宏的问题,我用它来记录各种信息
#define JELogVerbose(fmt,...) DDLogVerbose((@"%@ %@ - " fmt),NSStringFromClass([self class]),NSStringFromSelector(_cmd),##__VA_ARGS__)
当在块内部使用这个最终宏时会出现问题,它显然会强烈捕获自身,这可能是有问题的.
以下是解决方案的一些要求:
>它可以是一个多行宏,您可以在其中定义weakSelf但不能解决它,因为您可以重新定义您创建的__weak指针.
>使用__FILE__或__PRETTY_FUNCTION__因为它们捕获将捕获超类而不是子类.因此,对于用于创建许多实例的类的抽象,日志记录不区分每个实例.捕获当前类是绝对必要的
>该解决方案只需要修改宏或其他一些全局配置选项来修复此问题,而无需添加额外的扩展库
解决方法
更新:
现在我看到了什么问题.这个宏应该工作:
#define LOG_CLASS_NAME(obj) typedef typeof(*(obj)) SelfType; \ NSLog(@"typeof self is %@",[SelfType class]); LOG_CLASS_NAME(self) // typeof self is JEViewController
因为在编译时解析了typeof(* self),所以编译器不需要保留自身实例.这意味着在块内部使用此宏是安全的.
第一个答案:
__PRETTY_FUNCTION__怎么样?它打印一个类名和选择器.
NSLog("func: %s",__PRETTY_FUNCTION__); // func: [UIViewController viewDidAppear:]