Property, field, this, self 的差異, java C# objective-c++

以前在C#, Java 用 this感覺都只是為了讓自動完成視窗跳出來,但現在在 objective-C++撞到鐵板了。

先來說說property跟field有甚麼差

從C#來看,當你寫成 
public int X;
就是field。 但如果寫成
private int _X;
public int X{
     get{ return _X;}    //getter
     set{ _X=value;}    //setter
}

就是 property。
就我自己的了解,property只是物件導向中多了一層封裝的用途,但就上面的例子來說封個雕啊?在property裡面完全就沒有限制啊。所以如果是完全沒有限制的情況,我就會直接用field。

C#中的event 跟 delegate 也是封裝的差異

C#讓我覺得好用的原因就是在 setter 跟 getter的使用,如果你要用個property的話,你只要寫
int tmp = C.X;
compiler 會自動轉呼叫 X 的 getter。但在java的世界,我很討厭的是他一定要寫成
int tmp=C.getX();
然後 C# setter 用 C.X = tmp; 比較直接,而java就要變成 C.setX(tmp);

然後奇怪的是Java內建的型別用法也不統一,有的會省略get。 ex: Array.size() or .length()

 

下面是正題,在 C# 你直接使用 X = tmp (少了this) 的話,他會幫你呼叫他的setter。

但在 objective-c++ 有沒有寫 self 就有差了~

在.h 裡面我們這樣寫

NSObject *foo;
}
@property (nonatomic,retain) NSObject *foo;

接著在 .m 裡面寫上

NSObject *tmp=[NSObject new];
NSLog(@"1:tmp %d",[tmp retainCount]);     // 印出1沒問題
//foo=tmp;
//self.foo=tmp;
NSLog(@"2:tmp %d",[tmp retainCount]);    //如果沒有寫self.的話,就會印1,如果有寫就會變2
[tmp release];
//tmp=nil;
//下面不知道為什麼釋放 tmp 之後 還是會是1
NSLog(@"3:tmp %d",[tmp retainCount]);     //印出1

重點,因為compiler會幫忙把 self.foo 轉為 [self setFoo],這樣才會進入到setter去,否則你就會因為後面release掉了,將來某一個時刻用到foo時就會有問題了~

留言

黑鬼表示…
...我都沒在加self... 0rz

這個網誌中的熱門文章

好貴的東元冷氣維修--馬達啟動電容

台大醫院 婁培人 耳鼻喉科 就診

機車無法充電之整流器壞掉--$650