ios - objc_getAssociatedObject 返回 null

标签 ios objective-c-runtime

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

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/

相关文章:

iOS 13 导航栏大标题问题

ios - 如何使用谓词从核心数据中获取偶数和奇数值

objective-c - NSBundle 的 -load 方法如何向 Objective-C 运行时注册类和其他运行时资源?

objective-c - 如何从被调用的方法实现创建 NSInitation?

ios - 如何在我自己的应用程序中实现 Apple Music 中的迷你播放器?

ios - 如何在没有 UINavigationController 的情况下以编程方式返回到上一个 View ?

ios - 项目缺少框架文件夹

ios - 使用 Objective-C 和 Swift 创建内存泄漏

objective-c - 带有 bool 参数的 Objective-C 方法中出现奇怪的 "selector mangling"

objective-c - NSBlock 对象是如何创建的?