【Objective-C】iOS开发中常见的语句@synthesize obj=_obj的意义详解

     在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
spa

   在 64-bit时,运行时系统会自动给类添加 ivar,添加的 ivar 以一个下划线"_"作前缀。上面声明部分的 @synthesize window=_window; 意思是说,window 属性为 _window 实例变量合成访问器方法。.net

    也就是说,window属性生成存取方法是setWindow,这个setWindow方法就是_window变量的存取方法,它操做的就是_window这个变量。指针

    经过这个看似是赋值的这样一个操做,咱们能够在@synthesize 中定义与变量名不相同的getter和setter的命名,籍此来保护变量不会被不恰当的访问。

下面是一个常见的例子
写法一:
code

@interface MyClass:NSObject{    
        MyObjecct *_myObject;  
}  
@property(nonamtic, retain) MyObjecct *myObject;  
@end  
  
@implementatin MyClass  
@synthesize myObject=_myObject;

写法二:内存

@interface MyClass:NSObject{  
        
}  
@property(nonamtic, retain) MyObjecct *myObject;  
@end  
  
@implementatin MyClass  
@synthesize myObject=_myObject;

   这个类中声明了一个变量_myObject,又声明了一个属性叫myObject,而后用@synthesize生成了属性myObject的存取方法,这 个存取方法的名字应该是:setmyObject和getmyObject。@synthesize myObject=_myObject的含义就是属性myObject的存取方法是作用于_myObject这个变量的。这种用法在Apple的 Sample Code中很常见。
ci

    弄明白了这个语句的意思以后咱们也就清楚了myObject和_myObject的区别,那么,在使用的时候,有什么须要注意的地方,你们应该也都清楚了。是的,myObject是属性,而_ myObject才是变量,咱们最终操做的变量都是myObject。get


那么,一样是存取操做,语句it

self.nameVarPtr = [[ObjectName alloc] init]

nameVarPtr = [[ObjectName alloc] init]

两种赋值方式的区别何在呢?io


    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; 这才是最可靠的方法。

相关文章
相关标签/搜索