gpt4 book ai didi

ios - block 中的宏捕获 self

转载 作者:可可西里 更新时间:2023-11-01 03:33:01 27 4
gpt4 key购买 nike

我用下面的宏来记录各种信息有问题

#define JELogVerbose(fmt, ...)  
DDLogVerbose((@"%@ %@ - " fmt), NSStringFromClass([self class]),
NSStringFromSelector(_cmd), ##__VA_ARGS__)

当在 block 中使用这个 final 宏时会出现问题,它显然会强烈捕获 self,这可能会有问题。

以下是解决方案的一些要求:

  1. 它可以是一个多行宏,您可以在其中定义 weakSelf 但这并不能解决问题,因为您可以重新定义您创建的 __weak 指针。
  2. 使用 __FILE____PRETTY_FUNCTION__ 因为它们捕获将捕获父类(super class)而不是子类。因此,在用于创建许多实例的抽象类的情况下,日志记录不会区分每个实例。捕获当前类是绝对必要的
  3. 该解决方案只需要修改宏或其他一些全局配置选项即可解决此问题,而无需添加额外的扩展库

最佳答案

更新:

现在我知道问题出在哪里了。这个宏应该可以工作:

#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) 是在编译时解析的,所以编译器不需要保留 self 实例。这意味着在 block 内使用此宏是安全的。

第一个答案:

__PRETTY_FUNCTION__ 怎么样?它打印一个类名和选择器。

NSLog("func: %s", __PRETTY_FUNCTION__); // func: [UIViewController viewDidAppear:]

关于ios - block 中的宏捕获 self ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23370813/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com