您的位置:首页 > 其它

setter 和 getter 高级 以及内存管理初级

2016-01-09 20:42 387 查看
setter 和 getter 的演变,紧接setter 和 getter 初级

1.@property 和 @synthesize

这两个关键字的出现,就是为了剔除代码中的setter方法和getter方法

@property:可以自动生成某个成员变量的setter和getter声明

@property int age;
//相当于下面这两句:
- (void)setAge:(int)age;
- (int)age;

@synthesize自动生成age的setter和getter实现,并且会访问_age这个成员变量

@synthesize age = _age;

这样,我们就省去了写setter方法和getter方法的时间,当然写那个也是极其无聊也是毫无意义。

但是,即便是这样,还是很不爽,在xcode的老版本中,为了避免书写setter方法和getter方法,我们还必须要在@interface 和 @end之间写上 @property int _age; 在@implementation 和 @end 之间写上 @synthesize的代码,很幸运,你们生活在一个幸福的时代,自从xcode4.4之后,@property int _age; 这句代码就把@property和@synthesize的活儿都给干了。

它主要做了下面这几件事:
1)生成_age成员变量的get和set方法的声明;
2)生成_age成员变量set和get方法的实现;
3)生成一个_age的成员变量。
当然,@property方法生成的getter方法和setter方法可能满足不了您的需求,您也可以自己手动添加getter方法和setter方法, 如果手动写了setter方法@property就不会生成setter方法,但还是会生成getter方法,getter同理,如果您将setter方法,getter方法都进行手动书写了,@property将不会为您生成相应的getter方法和setter方法。

例子:

Teacher.h

@interface Teacher : NSObject

@property NSString *name;

@property NSString *gender;

@end

Teacher.m

@implementation Teacher

@synthesize name = _name;

@synthesize gender = _gender;

@end

2.@property

例子:

@property (nonatomic,copy) NSString *name;

@property (nonatomic,retain) NSString *gender;

@property (nonatomic) NSInteger age;

/*

属性的参数:

原子性: atomic 对属性加锁,保证多线程下线程安全,默认值

noatomic 对属性不加锁,多线程下不安全,但是速度快,通常使用!

读写属性: readwrite 生成getter和setter方法,默认值

readonly 只生成getter方法,只读

set方法处理: assign 直接赋值,默认值

使用范围:

理论上:所有数据类型

实际上:基本数据类型

assign (基本数据类型)方式:

- (void)setAge:(NSTnteger)age{

_age = age;

}

retain 在set方法中,对内存优化,先release原来的值,再retain新值

使用范围: 所有对象类型的数据都支持.包括: 系统提供的类和自定义的类

retain 方式:

- (void)setDog:(Dog *)dog{

if (_dog != dog){

[_dog release]; 先release原来的值

_dog = [dog retain]; 再retain新值

}

copy 在set方法中,对内存优化,先release原来的值,再copy新值

使用范围: 一般NSString 和 Block

所有遵守NSCopying协议的对象都支持<NSCopying>

*/

特别注意:以上setter的写法是在MRC环境下的写法,在ARC环境下,不存在retain和release(因为ARC环境下是自动管理引用计数),retain是纯粹的引用计数加1:

内存管理机制:引用计数机制

MRC:手动管理引用计数

ARC:自动管理引用计数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: