【OBJECTIVE-C】IOS开发中常见的语句@SYNTHESIZE OBJ=_OBJ的意义详解.doc
上传人:sy****28 上传时间:2024-09-10 格式:DOC 页数:4 大小:35KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

【OBJECTIVE-C】IOS开发中常见的语句@SYNTHESIZE OBJ=_OBJ的意义详解.doc

【OBJECTIVE-C】IOS开发中常见的语句@SYNTHESIZEOBJ=_OBJ的意义详解.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

www.tsingyuan.cnHYPERLINK"http://bbs.tsingyuan.cn/forum.php?mod=viewthread&tid=808"【Objective-C】iOS开发中常见的语句@synthesizeobj=_obj的意义详解我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesizewindow=_window;的语句,那么,这个window是什么,_window又是什么,两个东西分别怎么用,这是一个比较基本的问题,也关乎我们理解Objective-C中对类、类的属性、类的存取器、类的局部变量的统一理解。在32位系统中,如果类的@interface部分没有进行ivar声明,但有@property声明,在类的@implementation部分有响应的@synthesize,则会得到类似下面的编译错误:Synthesizedproperty‘xX’musteitherbenamedthesameasacompatibleivarormustexplicitlynameanivar在64-bit时,运行时系统会自动给类添加ivar,添加的ivar以一个下划线”_”做前缀。上面声明部分的@synthesizewindow=_window;意思是说,window属性为_window实例变量合成访问器方法。也就是说,window属性生成存取方法是setWindow,这个setWindow方法就是_window变量的存取方法,它操作的就是_window这个变量。通过这个看似是赋值的这样一个操作,我们可以在@synthesize中定义与变量名不相同的getter和setter的命名,籍此来保护变量不会被不恰当的访问。下面是一个常见的例子写法一:C代码@interfaceMyClass:NSObject{MyObjecct*_myObject;}@property(nonamtic,retain)MyObjecct*myObject;@end@implementatinMyClass@synthesizemyObject=_myObject;复制代码写法二:C代码@interfaceMyClass:NSObject{}@property(nonamtic,retain)MyObjecct*myObject;@end@implementatinMyClass@synthesizemyObject=_myObject;复制代码这个类中声明了一个变量_myObject,又声明了一个属性叫myObject,然后用@synthesize生成了属性myObject的存取方法,这个存取方法的名字应该是:setmyObject和getmyObject。@synthesizemyObject=_myObject的含义就是属性myObject的存取方法是做用于_myObject这个变量的。这种用法在Apple的SampleCode中很常见。弄明白了这个语句的意思之后,我们也就清楚了myObject和_myObject的区别,那么,在使用的时候,有什么需要注意的地方,大家应该也都清楚了。是的,myObject是属性,而_myObject才是变量,我们最终操作的变量都是myObject。那么,同样是存取操作,语句C代码self.nameVarPtr=[[ObjectNamealloc]init]复制代码C代码nameVarPtr=[[ObjectNamealloc]init]复制代码两种赋值方式的区别何在呢?self.nameVarPtr=xxx这种赋值方式等价于调用[selfsetnameVarPtr:xxx],而setnameVarPtr:xxx的方法的实现又是依赖于@property的属性的,比如retain,assign等属性。nameVarPtr=xxx的赋值方式,仅仅是对一个指针进行赋值。nameVarPtr仅仅是一个指针变量,记录了xxx的地址。在这个过程中不会调用setter方法,不会调用setter方法,就和@property没有关系,从而,也和retain,assign等属性没有关系。这种赋值方式就是一个简单的指针赋值。综上,对成员变量进行赋值,为防内存泄露需要注意的点:1.self调用setter方法的方式ObjectName*tmp=[[ObjectNamealloc]init];self.nameVarPtr=tmp;//retainCount=2[tmprelease];//retainCount=1复制代码2.指针赋值方式,不会调用setter方法nameVarPtr=[[ObjectNa