加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 如何实现关联引用?

发布时间:2020-12-16 05:02:02 所属栏目:百科 来源:网络整理
导读:我在这里看到了一个很好的样本: Subclass UIButton to add a property 它是什么?您无法将对象添加到类别.但现在有了这个技巧你可以. 那是什么?它是如何工作的? Objective-c对象已经有一些常数的ivar指针了吗? 现在你再添加一个?他们是怎么想出来的?
我在这里看到了一个很好的样本:
Subclass UIButton to add a property

它是什么?您无法将对象添加到类别.但现在有了这个技巧你可以.

那是什么?它是如何工作的?

Objective-c对象已经有一些常数的ivar指针了吗?

现在你再添加一个?他们是怎么想出来的?

我必须承认,这是一个非常丑陋的符号.

解决方法

使用关联引用技巧,您实际上并未向UIButton对象添加任何实例数据.相反,您正在使用一个完全独立的Cocoa工具来创建一个新的字典映射(或关联)现有UIButton对象与存储在堆中其他位置的数据.

如果不使用Cocoa的关联引用,你可以做同样的事情;它会更加丑陋甚至可能效率低下.在Objective-C中它会是这样的. (我甚至不会尝试在Objective-C中编写它,因为CFMutableDictionary和NSMutableDictionary在几个级别上都有错误的行为,我不打算从头开始编写所有内容.但是,C’ s std :: map不能用__weak引用我想要的方式使用它,所以我回到了这个效率低下的std :: vector算法.对于那些不熟悉C的人:std :: vector大致相当于一个NSMutableArray,除了你可以选择它是否保留其内容.)

关键是UIButton对象没有被改变;这个附加字典的内容正在发生变化.属性getter和setter只知道如何在该字典中查找内容,使其看起来好像UIButton具有新属性.

#import "UIButton+Property.h"
#import <algorithm>
#import <vector>

typedef std::pair<__weak id,__strong id> EntryType;
static std::vector<EntryType> myAR;

@implementation UIButton(Property)

-(void) setProperty:(id)property
{
    for (int i=0; i < myAR.size(); ++i) {
        if (myAR[i].first == self) {
            myAR[i].second = property;
            return;
        }
    }
    myAR.push_back(EntryType(self,property));
}

-(id) property
{
    /* To save space,periodically erase the dictionary entries for
     * UIButton objects that have been deallocated. You can skip this
     * part,and even use NSMutableDictionary instead of this C++
     * stuff,if you don't care about leaking memory all over the place.
     */
    size_t n = myAR.size();
    for (size_t i=0; i < n; ++i) {
        if (myAR[i].first == nil)
            myAR[i] = myAR[--n];
    }
    myAR.resize(n);

    /* Look up "self" in our dictionary. */
    for (size_t i=0; i < myAR.size(); ++i) {
        EntryType &entry = myAR[i];
        if (entry.first == self) {
            return entry.second;
        }
    }
    return nil;
}

@end

另见:http://labs.vectorform.com/2011/07/objective-c-associated-objects/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读