#import"ViewController.h"//属性关联属于动态运行时#import//设置keyconststaticNSString *key=@"indexPath";
有时候类的实例可能是某种机制所创建,而开发者无法令这种机制创建出自己所写的子类实例。
可以给某对象关联许多其他对象。这些对象会通过“键”来区分。
存储对象值的时候,可以指明“存储策略”,用以维护相应的“内存管理语义”。
以下方法用来管理关联对象:
① void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy);
此方法以给定的键和策略为某对象设置关联对象值。
② void objc_getAssociatedObject(id object, void *key);
此方法根据给定的键从某对象中获取相应的关联对象值。
③ void objc_removeAssociatedObjects(id object);
此方法移除指定对象的全部关联对象。
4. 设置关联对象用的键是个“不透明的指针”,即所指向的数据结构不局限于某种特定类型的指针。
再设置关联对象值时,若想令两个键匹配到同一个值,则二者必须时完全相同的指针才行。
跟NSDictionary不一样。NSDictionary认为“isEqual:”返回YES,则二者相同。
故设置关联对象值时,通常使用静态全局变量做键
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell*cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell"forIndexPath:indexPath];
UITextView*textView=[[UITextView alloc]initWithFrame:CGRectMake(0,0, _imgHeight,30)];
textView.layer.borderWidth=2;
textView.layer.borderColor=[UIColor redColor].CGColor;
[cell.contentView addSubview:textView];
//属性关联 设置
objc_setAssociatedObject(textView, key.UTF8String, indexPath , OBJC_ASSOCIATION_RETAIN);
textView.delegate=self;
returncell;
}
//UITextViewDelegate
- (void)textViewDidEndEditing:(UITextView *)textView
{
//属性关联 获取
NSIndexPath *indexPath=objc_getAssociatedObject(textView, key.UTF8String);
NSLog(@"%@",indexPath);
}
网友评论