iOS-关联属性Associate

iOS分类用的比较多,基本都是扩展方法,如果想要扩展属性,就要用到runtime了,使用

objc_getAssociatedObject

objc_setAssociatedObject

上代码:给Test新建一个分类,关联一个属性name;

#import "Test.h"

#import "Property.h"

@interface Test (pp)

@property(nonatomic ,
strong) Property* name;

@end

#import "Test+pp.h"

#import <objc/runtime.h>

static char* NAME;

@implementation Test (pp)

- (Property *)name{

return 
objc_getAssociatedObject(self,
NAME);

}

- (void)setName:(Property *)name{

objc_setAssociatedObject(self,
NAME, name,
OBJC_ASSOCIATION_COPY_NONATOMIC);

}

@end

注意因为用的是copy,所以Property类要遵守NSCopying协议。

在外部使用:

Property* two = [Property
new];

test.name = two;

内存释放会不会有问题?

#import "Property.h"

@implementation Property

-(void)dealloc{

NSLog(@"%s",__FUNCTION__);

}

- (id)copyWithZone:(NSZone *)zone{

Property* pro  = [Property
allocWithZone:zone];

return pro;

}

@end

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary
*)launchOptions

{

self.array = [NSMutableArray
array];

Property* pro = [[Property
alloc]
init];

Test* test = [Test
new];

test.name = pro;

Property* two = [Property
new];

test.name = two;

[self.array
addObject:pro];

[self.array
addObject:two];

return
YES;

}

输入打印结果:

2015-02-27 23:43:51.816 PNChartDemo[1486:40966] -[Property dealloc]

2015-02-27 23:43:51.816 PNChartDemo[1486:40966] -[Property dealloc]

pro和two都在数组中,自动释放的就是test中关联的copy那一份,test.name = two会释放[pro copy],test自动释放的时候会释放two.copy

由此可见关联的引用会在实例释放时,自动释放的。

时间: 2024-10-13 12:33:42

iOS-关联属性Associate的相关文章

【iOS】关联属性存取数据

有时候我们需要在现有的类存放一些额外的信息,通常的做法是继承一个子类,然后定义新增加的属性,然而如果我们为每个需要的类都添加一个类显得太麻烦了,objc提供了一个关联属性的特性,可以给一个对象关联一个属性(做过.NET的朋友一定熟悉附加属性,objc的关联属性与.NET的附加属性有点类似类似) 使用关联属性很简单,下面是几个主要的函数 //设置关联属性 objc_setAssociatedObject(id object, const void *key, id value, objc_Asso

runtime关联属性示例

前言 在开发中经常需要给已有的类添加方法和属性,但是Objective-C是不允许给已有类通过分类添加属性的,因为类分类是不会自动生成成员变量的.但是,我们可以通过运行时机制就可以做到了. 本篇文章适合新手阅读,手把手教你如何在项目中使用关联属性! API介绍 我们先看看Runtime提供的关联API,只有这三个API,使用也是非常简单的: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

IOS内容属性总结

四个容易混淆的属性 1.textAlignment:文字的水平方向对齐方式 1>取值 NSTextAlignmentLeft NSTextAlignmentCenter NSTextAlignmentRight 2>哪些控件有这个属性:一般能够显示文字的控件都有这个属性 UITextField UILabel UITextView 2.ContentVerticalAlignment:内容的垂直方向的对齐方式 1>取值 UIControlContentVerticalAlignmentC

iOS tabbar 属性

1.设置tabbar背景颜色 1 NSArray *controllers = [NSArray arrayWithObjects:nav_main,nav_channle,nav_me, nil]; 2 _tabController.viewControllers = controllers; 3 _tabController.delegate = self; 4 5 for (int i=0;i<self.tabController.viewControllers.count;i++) {

IOS TextField属性

原文请链接:http://blog.csdn.net/tskyfree/article/details/8121915/ //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef en

IOS UILabel属性

1  textAlignment有三种设置方式:(以UI开头,是ios6之前的用法) (1)  NSTextAlignmentLeft        为向左对齐 (2)  NSTextAlignmentCenter    为居中对齐 (3)  NSTextAlignmentRight      为向右对齐 2  linBreakMode(可选值) (当文本内容很多,label无法全部显示时label会将文本内容以省略号的方式代替) enum{ NSLineBreakByWordWrapping 

EF自动生成的(T4模板) 关联属性元数据修改

为了实现 T4模板关联属性 不要序列化的问题 就是要在具体的 关联属性上面添加一个元数据 这里利用以前的 Newtonsoft.Json 这个框架为例 效果应该为 就是要在关联属性上面添加元数据  [JsonIgnore] 注意: 默认会报错,如下 请记住错误个数,多了就证明你写的有问题.而且你不要奇怪有这么多错误. 如果你不出现这么多个错误提示,你就应该去找一下模板 如下的位置. 步骤 1.导入命名空间.不然出来的全是BUG //添加引用public string UsingDirective

iOS 关联的使用

关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分. 使用关联,我们可以不用修改类的定义而为其对象增加存储空间. 关联是基于关键字的,因此,我们可以为任何对象增加任意多的关联,每个都使用不同的关键字即可. 创建关联 objc_setAssociatedObject   static char Key; NSArray * array =[[NSArray alloc] initWidthObjects:@"red", @"green", @&

CSS3 变形、过渡、动画、关联属性浅析(转载)

一.变形 transform:可以对元素对象进行旋转rotate.缩放scale.移动translate.倾斜skew.矩阵变形matrix.示例: transform: rotate(90deg) scale(1.5,0.8) translate(100px,50px) skew(45deg,45deg); /*矩阵变形*/ matrix(<number>,<number>,<number>,<number>,<number>,<numb

CSS3变形、过渡、动画、关联属性浅析

一.变形 transform:可以对元素对象进行旋转rotate.缩放scale.移动translate.倾斜skew.矩阵变形matrix.示例: transform: rotate(90deg) scale(1.5,0.8) translate(100px,50px) skew(45deg,45deg); /*矩阵变形*/ matrix(<number>,<number>,<number>,<number>,<number>,<numb