ios – 宏块捕获自我

前端之家收集整理的这篇文章主要介绍了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相关文章