总结如下:



1、经过@property的属性,在赋值的时候最好带上self.来访问。比如声明为retain的属性a ,只有经过self.a=x;这样才会对x retain一次么,否则不会。在赋值的 时候最好这样写:


A * _a = [A alloc]int];  
   
 
   
 
     self.a = _a; 
   
 
   
 
      _a release;


2、经过@synthesize的属性,在释放的时候,如果@property的释放的时候要么这样写:



self.a = nil;



要么这样写 :



[a release];



        a = nil;



 



如果这样写:



[self.a release];



a = nil;



或者这样:



[self.a  release];



self.a = nil;



或者。。。



这 样的话编译器不会报错 ,但是运行时就会奔溃,提示 A release 时出问题 ,程序尝试 释放了已经释放的对象。这样写表面上看起来 跟上面没有多大的差别 啊,为什么会 出现这样的问题呢?问题就出在@property和@synthesize这俩关键字上面。



 



==========================================================================================



查看文档 可以发现self.a 访问a是get函数,self.a =nil;其实会先释放a原来指向的内存空间,然后将a赋值为nil,就是清空了对应的内存空间。所以self.a= nil;一句话就已经把对象的属性给释放掉了,后面不需要再release了。



==========================================================================================



 



另外初始化方法一定要在init后面的第一个字母大写,否则会出现问题,这是苹果的要求。



比如:

A * _a=[[A alloc]initwithX:(int)_x]; 
   
 
   

     self.a = _a; 
   
 
   

     [_a release];



这样经过Analyze,编译器会提示最后一句话有问题,这个地方拿不到对象的控制权却 去释放对象,有潜在内存泄露的可能。把w改成W就OK了。这 就是苹果要求的初始化一族的方法,init后面第一个字符必须 大写 。



 



===========================================分割线===============================================



 



self.xx和_xx的区别:



如果引用的话不会有区别,是同一个指针,如果赋值是有区别的 self.xx=oo  首先把xx retaincount -1然后retain oo,  _xx赋值直接指向oo 不存在retain这一步步。



 



 


转载于:


总结如下:



1、经过@property的属性,在赋值的时候最好带上self.来访问。比如声明为retain的属性a ,只有经过self.a=x;这样才会对x retain一次么,否则不会。在赋值的 时候最好这样写:



A * _a = [A alloc]int];  
   
 
   
 
     self.a = _a; 
   
 
   
 
      _a release;


2、经过@synthesize的属性,在释放的时候,如果@property的释放的时候要么这样写:



self.a = nil;



要么这样写 :



[a release];



        a = nil;



 



如果这样写:



[self.a release];



a = nil;



或者这样:



[self.a  release];



self.a = nil;



或者。。。



这 样的话编译器不会报错 ,但是运行时就会奔溃,提示 A release 时出问题 ,程序尝试 释放了已经释放的对象。这样写表面上看起来 跟上面没有多大的差别 啊,为什么会 出现这样的问题呢?问题就出在@property和@synthesize这俩关键字上面。



 



==========================================================================================



查看文档 可以发现self.a 访问a是get函数,self.a =nil;其实会先释放a原来指向的内存空间,然后将a赋值为nil,就是清空了对应的内存空间。所以self.a= nil;一句话就已经把对象的属性给释放掉了,后面不需要再release了。



==========================================================================================



 



另外初始化方法一定要在init后面的第一个字母大写,否则会出现问题,这是苹果的要求。



比如:



A * _a=[[A alloc]initwithX:(int)_x]; 
   
 
   

     self.a = _a; 
   
 
   

     [_a release];


这样经过Analyze,编译器会提示最后一句话有问题,这个地方拿不到对象的控制权却 去释放对象,有潜在内存泄露的可能。把w改成W就OK了。这 就是苹果要求的初始化一族的方法,init后面第一个字符必须 大写 。



 



===========================================分割线===============================================



 



self.xx和_xx的区别:



如果引用的话不会有区别,是同一个指针,如果赋值是有区别的 self.xx=oo  首先把xx retaincount -1然后retain oo,  _xx赋值直接指向oo 不存在retain这一步步。