主要參考文章:
橙色字型為自己標註的的內容,方便加深印象
iphone開發
self的用法
關於什麼時間用self. ,其實是和obj-c的訪問方法有關,不過網上很多人也都這麼解答的,那它為什麼和訪問方法有關?怎麼有關的?並沒有多少人回答出來.同時關於記憶體管理的內容,請大家看旺財勇士的objective-c記憶體管理總結~cc專版,有些東西我就不多解釋了.
進入正題,我們經常會在官方文件裡看到這樣的**:
myclass.h
[/lang]
@inte***ce myclass : nsobject
@property (nonatomic, retain) myobject *myobject;
@end
myclass.m
@synthesize myobject;
-(id)init
return self; }
有人就問,為什麼要這麼複雜的賦值?為什麼要加self. ?直接寫成self.myobject = [[myobject alloc] init];不是也沒有錯麼?不加self有時好像也是正常的?
現在我們來看看記憶體管理的內容:
先看間接賦值的:
1.加self.:
myobject * amyobject = [[myobject alloc] init]; //amyobject retaincount = 1;
self.myobject = amyobject; //myobject retaincount = 2;
[amyobject release];//myobject retaincount = 1;
2.不加self.:
myobject * amyobject = [[myobject alloc] init]; //amyobject retaincount = 1;
myobject = amyobject; //myobject retaincount = 1;
[amyobject release];//物件己經被釋放
再看直接賦值的:
3.加self.:
self.myobject = [[myobject alloc] init]; //myobject retaincount = 2;
4.不加self.:
myobject = [[myobject alloc] init]; //myobject retaincount = 1;
現在是不是有點暈,我們先來把**改一下,官方的一種常見寫法:
myclass.h
@inte***ce myclass : nsobject
@property (nonatomic, retain) myobject *myobject;
@end
myclass.m
@synthesize myobject = _myobject;
ok,你現在再試下
,如果你用
self._myobject = amyobject;
或者myobject = amyobject;
你會得到乙個錯誤
,為什麼呢
,這裡就是和
obj-c
的訪問方法有關了
.說白了很簡單,大家都知道, @property (nonatomic, retain) myobject *myobject;是為乙個屬性設定訪問方法,只是平時我們用的方法名和屬性名是一樣的,現在你把它寫成不同的名字,就會很清楚了. _myobject是屬性本身, myobject是訪問方法名.
一般來說self點出來的都是方法這個好辦,
但是標準的tab專案的delegate的m檔案裡會出現這樣的**
@synthesize window = _window;
@synthesize tabbarcontroller = _tabbarcontroller;
- (void)dealloc
之前一直很暈的問題是為什麼釋放的是_window 而不是window 也查過的問題是window = _window這種但是很多地方的解釋是window是_window的別名,或者說把window定義成_window的別名。但是這裡的解釋能夠更清楚地解答我的疑問了,@property和@synthesize是宣告是實現乙個屬性的訪問方法。@property是定義屬性說明需要訪問方法 @synthesize是合成訪問器是告訴編譯器生成屬性的get和set方法。以往的感覺是定義了屬性就會出現與之同名的變數 但是現在來看其實只是有個方法,如果沒有定義或者賦值到本體的內部成員變數上那麼會自動成聖與之同名的變數,如果賦值了那麼則證明 如window = _window則說明屬性window實際操作的是內部成員的_window. 也就是說 @property定義的是方法名@synthesize是讓編譯器自動生成方法。同時這裡還解決了我乙個問題就是關於readonly唯讀屬性的賦值問題,尤其是這種帶這window=_window的,現在來看是不生成set方法,而讀取方法返回的實際_window。
現在我們知道self.是訪問屬性的訪問方法了,那訪問方法又怎麼工作的? self.myobject = [[myobject alloc] init];為什麼會有記憶體洩露?
關於nonatomic我不多解釋了,它不是我要講的重點,而且我也沒完全搞清楚,不誤導大家.
關於nonatomic我這也是一敲不通啊,目前還沒用過atomicity模式的屬性。
我只說assign, retain ,copy.
get方法是:
-(myobject*)myobject
set方法是:
// assign
-(void)setmyobject:(id)newvalue
// retain
-(void)setmyobject:(id)newvalue }
// copy
-(void)setmyobject:(id)newvalue }
其實這些方法裡還有別的內容,並不只是這些.而且這些方法可以被重寫.比如你寫乙個
-(myobject*)myobject
放在你的類裡,你呼叫self.myobject時(不要把它放在等號左邊,那會呼叫get方法)就會呼叫這個方法.
這裡多說一句, @property是為你設定訪問方法,和你的屬性無關,你可以只寫一句
看來理解對了 和屬性本身無關 就是定義的訪問方法名
@property (readonly) nsstring *name;
在你的類裡實現
-(nsstring*)name
同樣可以用self.name呼叫.
現在回頭說說我們開始的那四個賦值,當不用self.的時候,那句話只是一般的賦值,把乙個指標賦給另乙個指標,不會對分配的記憶體有任何影響,所以2中不要最後[amyobject release];這句話和4是一回事.這裡就不多說了.我們看看1和3,
當呼叫setmyobject:方法時,對newvalue做了一次retain操作,我們必須把原來的newvalue釋放掉,不然就會記憶體洩露,在1裡,我們有個amyobject可以用來釋放,在3裡,我們無法釋放它,所以,在3裡,我們會多出來乙個retaincount.記憶體洩露了.
self.myobject = [[myobject alloc] init]會造成的記憶體洩露是說self點的時候乙個引用然後alloc以後又會有乙個 所以在這裡一下增加的是兩個引用計數。
說了這麼多,我只想讓大家清楚,什麼是呼叫屬性本身,什麼是呼叫訪問方法.怎麼樣才能避免記憶體洩露,而且,以上例子裡是在自己類裡的呼叫,如果這個類被別的
關於self 用法的一些總結
最近有人問我關於什麼時候用self.賦值的問題,我總結了一下,發出來給大家參考.有什麼問題請大家斧正.關於什麼時間用self.其實是和obj c的訪問方法有關,不過網上很多人也都這麼解答的,那它為什麼和訪問方法有關?怎麼有關的?並沒有多少人回答出來.同時關於記憶體管理的內容,請大家看旺財勇士的obj...
關於self 用法的一些總結
最近有人問我關於什麼時候用self.賦值的問題,我總結了一下,發出來給大家參考.有什麼問題請大家斧正.關於什麼時間用self.其實是和obj c的訪問方法有關,不過網上很多人也都這麼解答的,那它為什麼和訪問方法有關?怎麼有關的?並沒有多少人回答出來.同時關於記憶體管理的內容,請大家看旺財勇士的obj...
關於專注,關於最近的一些事情
這是自己第一次寫非技術的部落格,但是不寫不行了。最近心情很沉重,因為自己又又又又又一次把事情搞砸了,47個人裡排倒數第二,當看到成績的時候心情真的很壓抑。不止一次開始認認真真的做一件事,然後到一半的時候注意力不夠集中,然後造成一系列的後果。學車的時候,各種公升學考試的時候,軟體設計師考試的時候,求職...