码迷,mamicode.com
首页 > 移动开发 > 详细

iOS 学习笔记——0004(@property详解)

时间:2015-10-15 22:14:26      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:

这里以一个Person类进行举例:
 
@interface Person : NSObject
{
     ...
}
@property(nonatomic,copy)NSString* name;
@end
 
 
@property 做了三件事
1.大括号中(如上图的大括号),声明变量,变量前加_,这里是_name
2.生成对应的get方法
3.生成对应的set方法
 
 
可以在实现文件中,重写get,set方法
这里需要注意:如果get,set方法都是自己写的话,那么在大括号中的变量声明也需要自己写了

写到这里就不得不提一下.语法
.语法的前提是 需要有一套 get set 方法
这个Circle类虽然没有length属性,但是在实例化出来的对象中是可以用.来访问的
eg:
#import <Foundation/Foundation.h>
#define PI 3.14159
@interface Circle : NSObject
@property(nonatomic)
float r; -(float)length; -(void)setLength:(float)length;
@end
#import "Circle.h" @implementation Circle -(float)length { return self.r * 2 * PI; } -(void)setLength:(float)length { self.r = length / (2 * PI); } @end

 

 

ps:在构造函数中,尽量不要使用属性,应该直接去操作变量
如:
-(instancetype)init
{
    if (self  = [super init])
    {
        self.name = @"aaa";
        _sid = 10000;     //这个带下划线的变量仅仅是本类的变量,父类的变量是访问不到的,若要访问父类的变量,要向上一行那样
    }
    return self;
}

几个关键字的区别:
1.可读性:readonly 、readwrite(默认)
@property(readwrite,....) valueType value;这个属性是变量的默认属性,通过加入readwrite属性你的变量就会有get方法,和set方法。
@property(readonly,...) valueType value;这个属性变量就是表明变量只有可读方法,也就是说,你只能使用它的get方法。
 
2.assign(默认)
setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题
应用场合:对基础数据类型 (例如NSInteger,CGFloat)和C数据类型(int, float, double, char, 等),不存在所有权关系的对象,比如常见的delegate。
3.retain
setter方法对参数进行release旧值再retain新值
与strong相对应,使用了引用计数,retain+1,release -1;当引用 计数为0时,内存被释放,如下代码所示:
-(void)setName:(NSString*)_name{  
     //首先判断是否与旧对象一致,如果不一致进行赋值。  
     //因为如果是一个对象的话,进行if内的代码会造成一个极端的情况:当此name的retain为1时,使此次的set操作让实例name提前释放,而达不到赋值目的。  
     if ( name != _name){  
          [name release];  
          name = [_name retain];  
     }  
}
4.copy
与strong类似,但区别在于copy是两块内存,而strong是传了对象的指针,操作的是一块内存
应用场合:NSString,NSArray,都要用copy修饰
(这里举个例子来说明:如果将NSMutableString传给NSString,操作同一块内存的话,NSMutableString改变会影响NSString,是有风险的)
5.strong与weak
是由ARC新引入的对象变量属性,ARC引入了新的对象的新生命周期限定
简单讲strong等同retain
weak比assign多了一个功能,当对象消失后自动把指针变成nil,好处不言而喻
6.atomic(默认)与nonatomic
atomic:atomic意为操作是原子的,意味着只有一个线程访问实例变量。atomic是线程安全的,至少在当前的存取器上是安全的。它是一个默认的特性,但是很少使用,因为比较影响效率。nonatomic:nonatomic跟atomic刚好相反。表示非原子的,可以被多个线程访问。它的效率比atomic快。但不能保证在多线程环境下的安全性,在单线程和明确只有一个线程访问的情况下广泛使用。

iOS 学习笔记——0004(@property详解)

标签:

原文地址:http://www.cnblogs.com/amazinglin/p/4883712.html

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