注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

@property和@synthesize  

2015-05-13 20:35:43|  分类: iOS |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
原文:http://justcoding.iteye.com/blog/1444548
一、基本知识
Objective-C中@property与@synthesize和配对使用,其目的是让编译好器自动编写一个与数据成员同名的方法声明来省去读写方法的声明。
 如:
1、在头文件中:

@property int count;  

等效于在头文件中声明了一个变量 int _count和2个方法:

- (int)count;  
-(void)setCount:(int)newCount;  


2、实现文件(.m)中

@synthesize count;  

等效于在实现文件(.m)中实现2个方法。

- (int)count  
{  
    return count;  
}  
-(void)setCount:(int)newCount  
{  
    count = newCount;  
}  
以上等效的函数部分由编译器自动帮开发者填充完成,简化了编码输入工作量。
@synthesize myProperty=myIvar;
@synthesize 中可以定义 与变量名不相同的getter和setter的命名,籍此来保护变量不会被不恰当的访问:
myProperty对应外部访问变量的方法名(getter/setter),myIvar对应内部访问该变量的变量名为,@synthesize 声明的对内部使用的变量名总是当做 @private
二、语法简介
声明property的语法为:@property (参数1,参数2,参数3) 类型 名字
 如:

@property(nonatomic,retain) UIWindow *window;  

 其中参数主要分为三类:
读写属性: (readwrite/readonly)
setter语意:(assign/retain/copy)
原子性: (atomicity/nonatomic)
各参数意义如下:
readwrite: 产生setter\getter方法
readonly: 只产生简单的getter,没有setter。
assign: 默认类型,setter方法直接赋值,而不进行retain操作
retain/strong: setter方法对参数进行release旧值,再retain新值。
copy: setter方法进行Copy操作,与retain一样
weak/unsafe_unretained:该属性对应 __weak 关键字,与 __weak 定义的变量一致,该属性所声明的变量将没有对象的所有权,并且当对象被破弃之后,对象将被自动赋值nil。
nonatomic: 禁止多线程,变量保护,提高性能
三、语法详解
3.1,声明属性getter写操作权限
readwrite
声明此属性为读写属性,即可以访问设置方法(setter),也可以访问获取方法(getter),与readonly互斥。
它为默认属性
readonly
声明此属性为只读属性,只能访问此属性对应的获取方法(getter),与readwrite互斥。
3.2、声明setter写方法的实现
assign
声明在setter方法中,采用直接赋值来实现设值操作。如:

-(void)setName:(NSString*)_name{  
     name = _name;  
}  
对于基本类型或结构体的变量,它为默认属性
retain
声明在setter方法中,需要对设过来的值进行retain 加1操作。如:
-(void)setName:(NSString*)_name{  
     /*首先判断是否与旧对象一致,如果不一致进行赋值。 因为如果是一个对象的话,进行if内的代码会造成一个极端的情况:当此name的retain为1时,使此次的set操作让实例name提前释放,而达不到赋值目的*/
     if ( name != _name){  
          [name release];  
          name = [_name retain];  
     }  
}  
copy
调用此实例的copy方法,设置克隆后的对象。实现参考retain。
strong
等同于retain该属性值对应 __strong 关键字,即该属性所声明的变量将成为对象的持有者。对于对象类型的变量,它为默认属性
weak
该属性对应 __weak 关键字,与 __weak 定义的变量一致,该属性所声明的变量将没有对象的所有权,并且当对象被破弃之后,对象将被自动赋值nil。
并且,delegate 和 Outlet 应该用 weak 属性来声明。 iOS 5 之前的版本是没有 __weak 关键字的,所以 weak 属性是不能使用的。这种情况我们使用 unsafe_unretained。
unsafe_unretained
等效于__unsafe_unretaind关键字声明的变量;像上面说明的,iOS 5之前的系统用该属性代替 weak 来使用。
我们再来看看与所有权有关系的属性,关键字间的对应关系
属性值           关键字        所有权
strong__strong
weak__weak
unsafe_unretained__unsafe_unretained
copy__strong
assign__unsafe_unretained
retain__strong

3.3,访问方法的原子性
nonatomic
在默认的情况下,通过synthesized 实现的 setter与getter 都是原子性访问的。多线程同时访问时,保障访问方法同时只被访问一个线程访问,如:

[ _internal lock ]; // lock using an object-level lock  
id result = [ [ value retain ] autorelease ];  
[ _internal unlock ];  
return result;  

 但如果设置nonatomic时,属性的访问为非原子性访问。
 四、语法举例
property参数中比较复杂的是retain和copy,具体分析如下:
 4.1、getter 分析
 示例1-1

@property(nonatomic,retain)test* thetest;  
@property(nonatomic ,copy)test* thetest;

 其getter等效代码:
-(void)thetest  
{  
  return thetest;  
}  
 示例1-2

@property(retain)test* thetest;  
@property(copy)test* thetest;  

其getter等效代码:

-(void)thetest  
{  
    [thetest retain];  
    return [thetest autorelease];  
}  

4.2、 setter分析
  示例2-1

@property(nonatomic,retain)test* thetest;  
@property(retain)test* thetest;  

其setter等效于:

-(void)setThetest:(test *)newThetest {  
    if (thetest!= newThetest) {  
        [thetest release];  
        thetest= [newThetest retain];  
    }  
}
  示例2-2 

@property(nonatomic,copy)test* thetest;  
@property(copy)test* thetest;  

 其setter等效于:
-(void)setThetest:(test *)newThetest {  
    if (thetest!= newThetest) {  
        [thetest release];  
        thetest= [newThetest copy];  
    }  
}  

  评论这张
 
阅读(323)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017