大佬教程收集整理的这篇文章主要介绍了objective-c – 如何实现关联引用?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
它是什么?您无法将对象添加到类别.但现在有了这个技巧你可以.
那是什么?它是如何工作的?
Objective-c对象已经有一些常数的ivar指针了吗?
我必须承认,这是一个非常丑陋的符号.
如果不使用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/
以上是大佬教程为你收集整理的objective-c – 如何实现关联引用?全部内容,希望文章能够帮你解决objective-c – 如何实现关联引用?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。