iOS中属性及其特质@property、attribute

属性:

属性@property和属性attribute不同,@property在OC里有自己的一套专对实例变量的处理机制。attribute我们可以特指属性所具有或遵循的特质。

使用属性,编译器就会自动编写访问这些属性所需的方法,此过程叫做“自动合成”(autosynthesis).自动合成的过程是编译器在编译期执行。除此之外,编译器还要自定向类中添加适当类型的实例变量,并且在属性名前面加下划线,以此作为实例变量的名字。也可以用@synthesize 类指定实例变量的名字:

如:用@property声明了一个first的字符串变量:

@property (nonatomic,strong) NSString *firstName;

@sybthesize firstName = _myFirstName;//相当于更改了@property里的实例变量的名字_firstName 为 _myFirstName

@dynamic 关键字

告诉编译器:不要自动创建实现属性所用的实例变量,也不要为其创建存取方法。而且,在编译访问属性代码时,即使编译器发现没有定义存取方法,也不会报错。他相信这些方法在运行时期能找到。

比如,从CoreData框架中的NSManagedObject类里继承了一个子类,那么就需要在运行期动态创建存取方法。因为子类的某属性不是实例变量,其数据来自后端数据库中。

属性的特质:

@property (nonatomic, readwrite, copy) NSString *firstName;//三个特质

自己定义存取方法的时候,就要遵从与属性特质相符的原子性。

原子性特质:

atomic:通过锁定机制来确保其操作的原子性。如果两个线程同时读同一属性,那么无论何时, 总能看到有效的属性值。

nonatomic:不加锁,一个线程正在修改属性值时,另外一个线程也许会突然闯入,把尚未修改好 的属性值读取出来。

读写权限特质:

readwrite:属性拥有setter,getter方法,如若该属性由@synthesize实现,则编译器会自动生成这 两个方法。

readonly:属性仅拥有获取方法,自由当该属性由@synthesize实现时,编译器才会为其合成获取 方法,你可以用此特质把某个属性对外公开为只读属性,然后在.m中将其重新定义为读写属性。

内存管理语义特质:

assign:只会执行对“纯量类型”的简单赋值操作。

strong:该属性定义了一种“拥有关系”(owning relationship).为这种属性设置新值时,设置方法 先保留新值,并且释放旧值,然后再将新值设置上去。

weak:“非拥有关系”。为这种属性设置新值时,设置方法即不保留新值,也不释放旧值。属性所致的对象在销毁时,属性值也会被清空。

unsafe_unretained:与assign类似。但它只适用于“对象类型”,“非拥有关系”。当目标对象销毁时,属性值不会自动清空(所以说是不安全的,unsafe),这一点与weak 不同。

copy:设置方法不保留新值,而将其拷贝“copy”.当属性类型为NSString* 时,经常用此特质来保护其封装性。因为传递给设置方法的新值有可能指向一个样NSMutableString类的实例。这个类是NSString的子类,表示可以修改其值得字符串。此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以这是就要拷贝一份“不可变”(immutable)得字符串。确保对象中的字符串值不会无意间变动。

方法名语义特质:

getter=<name>:指定“获取方法”的方法名。如果属性是Boolean型的,就可以给获取该属性的getter方法改名为isOn之类的。

setter=<name>: 一般不用。

一些复杂的属性要使用懒加载来初始化:

1、懒加载,如果使用了懒加载技术,必须通过存取方法来访问属性。懒加载的属性一般是比较复杂的属性。如自定义的属性,数组属性,字典属性等。

2、在初始化方法和dealloc方法里,总是应该直接通过实例变量来读写数据。

3、在对象内部读取数据时,应该直接通过实例变量来读,而写入数据,应该通过属性来写。

时间: 2024-12-29 09:08:02

iOS中属性及其特质@property、attribute的相关文章

iOS中属性 (nonatomic, copy, strong, weak)的使用 By hL

以下内容来自Stackflow的详解 1.Nonatomicnonatomic is used for multi threading purposes. If we have set the nonatomic attribute at the time of declaration, then any other thread wanting access to that object can access it and give results in respect to multi-th

【转】iOS中属性与成员变量的区别

转载自http://www.cnblogs.com/crazypebble/p/3439261.html 一.类Class中的属性property 在ios第一版中,我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: @interface MyViewController :UIViewController { UIButton *myButton; } @property (nonatomic, retain) UIBut

iOS中属性与成员变量的区别

一.类Class中的属性property 在ios第一版中,我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: @interface MyViewController :UIViewController {     UIButton *myButton; } @property (nonatomic, retain) UIButton *myButton;@end 最近,苹果将默认编译器从GCC转换为LLVM(low lev

ios中关于property和arc的weak,strong

在ios中可以采用声明是属性来定义实例变量和属性 在.h文件中直接使用@property  在.m文件中使用扩张定义内部使用的的 格式位@property(参数1,参数2)类型  名称 参数有三类 1.读写属性的 :(readwrite/readonly/setter=/getter=) 2.setter语意:(assign/retain/copy) 3.原子性:(atomicity/nonatomic) 第一类 用于设置set和get方法sette=和getter=用于设置指定的get和set

iOS中为什么block用copy属性

1. Block的声明和线程安全Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC下返回Block).另一个需要注意的问题是关于线程安全,在声明Block属性时需要确认“在调用Block时另一个线程有没有可能去修改Block?”这个问题,如果确定不会有这种情况发生的话,那么Block属性声明可以用nonatomic.如果不肯定的话(通常情况是这样的),那么你首先需要声明Block

iOS中的成员变量,实例变量,属性变量

在ios第一版中: 我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: 注意:(这个是以前的用法) @interface MyViewController :UIViewController { UIButton *myButton; } @property (nonatomic, retain) UIButton *myButton; @end 在现在iOS版本中: 苹果将默认编译器从GCC转换为LLVM(low leve

iOS 中 为cagetory 添加属性

我们知道 在iOS中cagetory里面只能添加方法 ,如果我们想添加属性 就要用到 <objc/runtime.h> 中 OBJC_EXPORT void objc_setAssociatedObject(idobject, constvoid *key, id value, objc_AssociationPolicy policy)__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);OBJC_EXPORT id objc_getAssoc

iOS中UIPickerView常见属性和方法的总结

UIPickerView是iOS中的原生选择器控件,使用方便,用法简单,效果漂亮. @property(nonatomic,assign) id<UIPickerViewDataSource> dataSource; @property(nonatomic,assign) id<UIPickerViewDelegate>   delegate; 设置数据源和代理 @property(nonatomic) BOOL showsSelectionIndicator; 是否显示选择框,在

iOS中手势的delaysTouchesBegan属性用法(挖坑)

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/css/cuteeditor.css);iOS中手势的delaysTouchesBegan属性用法(挖坑),布布扣,bubuko.com