總結如下:
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這一步步。