码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-01-09 21:36:57      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:

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:自动管理引用计数

 

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

标签:

原文地址:http://www.cnblogs.com/blogofgsl/p/5117227.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!