ios – 宏块捕获自我

我有下面的宏的问题,我用它来记录各种信息
#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:]

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...