当前位置:首页 > 编程开发

iOS开发中常见的语句@synthesize obj=_obj的意义详解

webgou14年前 (2013-02-07)编程开发186

  我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一个比较基本的问题,也关乎我们理解Objective-C中对类、类的属性、类的存取器、类的局部变量的统一理解。

在32位系统中,如果类的 @interface 部分没有进行 ivar 声明,但有 @property 声明,在类的 @implementation 部分有响应的 @synthesize,则会得到类似下面的编译错误:
Synthesized property 'xX' must either be named the same as a compatible ivar or must explicitly name an ivar
在 64-bit时,运行时系统会自动给类添加 ivar,添加的 ivar 以一个下划线"_"做前缀。
上面声明部分的 @synthesize window=_window; 意思是说,window 属性为 _window 实例变量合成访问器方法。
也就是说,window属性生成存取方法是setWindow,这个setWindow方法就是_window变量的存取方法,它操作的就是_window这个变量。通过这个看似是赋值的这样一个操作,我们可以在@synthesize 中定义与变量名不相同的getter和setter的命名,籍此来保护变量不会被不恰当的访问。

下面是一个常见的例子
写法一:
C代码  收藏代码
  1. @interface MyClass:NSObject{    
  2.         MyObjecct *_myObject;  
  3. }  
  4. @property(nonamtic, retain) MyObjecct *myObject;  
  5. @end  
  6.   
  7. @implementatin MyClass  
  8. @synthesize myObject=_myObject;  
 

写法二:
C代码  收藏代码
  1. @interface MyClass:NSObject{  
  2.         
  3. }  
  4. @property(nonamtic, retain) MyObjecct *myObject;  
  5. @end  
  6.   
  7. @implementatin MyClass  
  8. @synthesize myObject=_myObject;  
 
这个类中声明了一个变量_myObject,又声明了一个属性叫myObject,然后用@synthesize生成了属性myObject的存取方法,这个存取方法的名字应该是:setmyObject和getmyObject。@synthesize myObject=_myObject的含义就是属性myObject的存取方法是做用于_myObject这个变量的。这种用法在Apple的Sample Code中很常见。
弄明白了这个语句的意思之后,我们也就清楚了myObject和_myObject的区别,那么,在使用的时候,有什么需要注意的地方,大家应该也都清楚了。是的,myObject是属性,而_ myObject才是变量,我们最终操作的变量都是myObject。
那么,同样是存取操作,语句
C代码  收藏代码
  1. self.nameVarPtr = [[ObjectName alloc] init]   
 
C代码  收藏代码
  1. nameVarPtr = [[ObjectName alloc] init]  
两种赋值方式的区别何在呢?

 

self.nameVarPtr=xxx 这种赋值方式等价于调用 [self setnameVarPtr:xxx], 而setnameVarPtr:xxx的方法的实现又是依赖于@property的属性的,比如retain,assign等属性。


nameVarPtr = xxx 的赋值方式,仅仅是对一个指针进行赋值。nameVarPtr仅仅是一个指针变量,记录了xxx的地址。在这个过程中不会调用setter方法,不会调用setter方法,就和@property没有关系,从而,也和retain,assign等属性没有关系。这种赋值方式就是一个简单的指针赋值。


综上,对成员变量进行赋值,为防内存泄露需要注意的点:

1.self调用setter方法的方式

ObjectName*  tmp= [[ObjectName alloc] init];

self.nameVarPtr =tmp;                 //retainCount=2

[tmp release];                               //retainCount=1


2.指针赋值方式,不会调用setter方法

nameVarPtr= [[ObjectName alloc] init]; // retainCount=1


所以,笔者建议大家在对某个变量进行赋值操作的时候,尽量要写self.myObj = xxx; 这才是最可靠的方法。

来源:http://moto0421.iteye.com/blog/1577459

扫描二维码推送至手机访问。

版权声明:本文由知了博客发布,如需转载请注明出处。

本文链接:https://www.webgou.info/?id=553

分享给朋友:

“iOS开发中常见的语句@synthesize obj=_obj的意义详解” 的相关文章

ARM寄存器简介

ARM寄存器介绍 ARM处理器共有37个寄存器。其中包括:31个通用寄存器,包括程序计数器(PC)在内。这些寄存器都是32位寄存器。以及6个32位状态寄存器。但目前只使用了其中12位。ARM处理器共有7种不同的处理器模式,在每一种处理器模式中有一组相应的寄存器组。任意时刻(也就是任意的处理器模式下)…

vs2005运行tcpmp遇到"SignTool Error: No certificates were found that met all the given criteria."

"SignTool Error: No certificates were found that met all the given criteria."…

工作中的小失误原因分析

在工作中,测试发现的一个问题,追其原因是----把代码同步错了.这几天心中一直在想,如何尽量避免这样的小错误.那有又哪些原因呢? 罗列下原因: 1.在写程序时,被打断次数太多,临时追加任务就很容易出错. 2.去调车,在太阳下晒一两天,我想基本上是没心事再去总结问题或是写代码. 3.变化时刻存在:领…

Android = Java

最近整个Java阵营都陷于一场讨论Oracle和Google之间关于Android平台的专利诉讼官司的混战中。我已经在很多地方都发表过我的观点,但这确实是个 重大的话题,需要在所有地方反复重申这个观点 … 所以,这篇文章就是要再次的完全的揭露事实真相。 第八大千禧年问题: Androi…

Android图片浏览源码解读

Android手机操作系统的应用方式灵活,简单,深受广大编程爱好者的喜爱。尤其是它的开源代码,使得我们能够方便的得到自己想要的功能需求。今天我们就为大家带来了有关Android图片浏览的相关方法。首先是Android图片浏览中layout xml:< ?xml versio…

GPS NMEA-0183协议详解

GPS NMEA-0183协议详解…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。