您的位置:首页 > 移动开发 > Objective-C

Objective-C 11 属性property

2016-02-17 16:40 501 查看
一般成员变量对外都需要set和get方法。例如Student.h文件中

#import <Foundation/Foundation.h>

@interface Student : NSObject {
int age;
int _no;
float _height;
}

- (void)setAge:(int)newAge;
- (int)age;

- (void)setNo:(int)newNo;
- (int)no;

- (void)setHeight:(float)newHeight;
- (float)height;


而且还需要在.m文件中实现这俩方法。

- (void)setAge:(int)newAge {
age = newAge;
}

- (int)age {
return age;
}


成员变量少还好,但是成员变量多的话就需要写许多代码来实现这些方法。

这样会造成大量的垃圾代码,苹果公司在Objective-C 2.0中引入了属性(property),它组合了新的预编译指令和新的属性访问器语法。新的属性功能显著减少了必须编写的冗长代码的数量。

@property

@property会自动声明和实现变量的get和set方法。

Student.h文件

#import <Foundation/Foundation.h>

@interface Student : NSObject {
int age;
int _no;
float _height;
}

// 当编译器遇到@property时,会自动展开成getter和setter的声明
@property int age;
//- (void)setAge:(int)newAge;
//- (int)age;

@property int no;
//- (void)setNo:(int)newNo;
//- (int)no;

@property float height;
//- (void)setHeight:(float)newHeight;
//- (float)height;

@end
通过@property可以省略setter和getter方法的生明。效果和上面的一样。

Student.m文件

#import "Student.h"

@implementation Student

// @synthesize age, height, no;

// @synthesize会自动生成getter和setter的实现

// @synthesize默认会去访问跟age同名的变量
// 如果找不到同名的变量,会自动生成一个<span style="color:#ff0000;">私有</span>的同名变量age
// @synthesize age;

@synthesize age;
//- (void)setAge:(int)newAge {
//    age = newAge;
//}
//
//- (int)age {
//    return age;
//}

@synthesize height = _height;
//- (void)setHeight:(float)newHeight {
//    _height = newHeight;
//}
//
//- (float)height {
//    return _height;
//}

@synthesize no = _no;
//- (void)setNo:(int)newNo {
//    _no = newNo;
//}
//
//- (int)no {
//    return _no;
//}

@end
@synthesize也是一种新的编译器功能,表示“创建了该属性的访问代码”。

所有的属性都是基于变量的,所以在合成(synthesize)getter和setter方法的时候,编译器会自动创建与属性名称相同的实例变量,所以可以省略变量age的声明。但是如果变量想要自擂直接通过属性访问,则不能省略,必需在头文件中声明。

@synthesize height = _height; 代表getter和setter会去访问_height这个成员变量,没有这个变量会自动创建_height;
在Xcode4.5以后的版本中,可以不必使用@synthesize了,这时编译器自动创建属性名称前加下划线的实例变量,

@property int age;
@property int no;
@property float height;
@property int number;
不使用@synthesize会访问_age  _no  _height  _number; 如果找不到会自动创建私有变量int _age; int _no; float _height; int _number;

两个地方可以添加实例变量的声明:头文件和实现文件。然后有什么区别呢?

假设有一个子类,并且想要从子类直接通过属性访问父类中的变量,这种情况变量必须放在头文件中。如果变量只是属于当前类,则可以把他们放在.m文件中。

参数

属性设置参数的方法:@property(参数,参数)类型 名字;

其中参数可以设置也可以不设置,当然可以是1个或多个了。

读写属性(readwrite/readonly)

默认情况下属性是readwrite,可读可写的,也就是会生成setter和getter方法。

readonly  只读的,只生成getter方法,不生成setter方法。

atomicity(nonatomic)

默认情况是atomic,读取函数为原子操作。

atomic就代表给方法进行加锁,保证线程安全。

nonatomic代表方法不需要考虑线程安全问题。

setter语意(assign/retain/copy)

assign/retain/copy 决定了以何种方式对数据成员赋予新值。assign是默认的。

1 copy/reain/assign 在其中选择一个来确定属性的setter如何处理这个属性。NSObject对象采用这个中方式。

2 一些特别的Object比如NSSstring使用copy。

3 assign关键字代表setter直接赋值,而不是复制或者保留它。适用于基本数据类型,比如NSInteger和CGFloat,或者你并不直接拥有的类型,比如delegates。

4 retain代表:在set方法中,release旧值,retain新值

strong与weak
strong:强引用,也是我们通常说的引用,其存亡直接决定了所指向对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示在列表中,则此对象会被从内存中释放。
weak:弱引用,不决定对象的存亡。即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除。 指针置为nil;一般storboard连接的控件都是weak。
strong与retain功能相似;weak与assign相似,只是当对象消失后weak会自动把指针变为nil;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: