gpt4 book ai didi

ios - objc_getAssociatedObject 返回 null

转载 作者:行者123 更新时间:2023-11-28 18:03:39 25 4
gpt4 key购买 nike

这是我设置关联对象的方式:

objc_setAssociatedObject(navigationItem, "rightButton", leftButtonView, OBJC_ASSOCIATION_RETAIN);

这是我得到它的方式:

UIButton *favoriteButton = (UIButton *)objc_getAssociatedObject(self.navigationItem, "rightButton");

对象在两个实例中都是一个UIButton,并且我在两个类中都有#import "objc/runtime.h"

事情是,它曾经有效,但现在由于某种原因它返回 null。有什么想法吗?

编辑

我通过将 navigationItem 作为参数传递给另一个类来设置关联对象:

+ (void)setNavigationBarTitle:(NSString *)title 
andLeftButton:(NSString *)leftButtonTitle
withSelector:(SEL)leftSelector
andRightButton:(NSString *)rightButtonTitle
withSelector:(SEL)rightSelector
andTarget:(id)target
forNavigationItem:(UINavigationItem *)navigationItem;

我在我的实用程序类中使用这个便捷方法为我的应用程序中的每个新 View Controller 设置一个导航栏。创建导航栏按钮时,我将它们与导航项相关联 - 我在问题中的第一行代码。

最佳答案

这是在黑暗中拍摄的,因为我无法重现该问题。问题可能是objc_set/getAssociatedObject()key 参数是一个唯一的指针

所以如果两个不同的类使用字符串,你的代码将无法工作“rightButton” 在不同的内存位置。字符串具有相同的内容,但指针不同。

在任何情况下,您都应该确保相同的 key 用于设置和检索关联对象:

  • 在公共(public)头文件(或 .pch 文件)中放置一个 extern 声明:

    extern const void *rightButtonKey;
  • 一个 .m 文件中定义变量。 “自引用”保证指针具有唯一值:

    const void *rightButtonKey = &rightButtonKey;
  • 然后像这样使用它

    objc_setAssociatedObject(navigationItem, rightButtonKey, leftButtonView, OBJC_ASSOCIATION_RETAIN);

关于ios - objc_getAssociatedObject 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19933010/

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