2013-07-19 57 views
1

,如果我在我的主文件下面對象變量和對象語法

int main (int argc, const char * argv[]) 
    { 
     @autoreleasepool 
     { 
      Complex * c1 = [[Complex alloc] init]; 
      Complex * c2 = [[Complex alloc] init]; 

      Complex * compResult; 

      compResult = [c1 add: c2]; 
      [compResult print]; 
     { 

     return0;   

    { 

/**implementation of add method **/ 
-(Complex *) add: (Complex *) f 
{ 
    Complex *result = [[Complex alloc] init] 
    result.real = real + f.real; 
    result.imaginary = imaginary + f.imaginary; 
    return result; 
} 

我知道,C1,C2爲對象,但compResult認爲是一個變量,直到我們做 compResult = [C1補充:C2 ]。

我在這裏的假設是add方法返回一個Object,並通過執行compResult = [c1 add:c2];我們將compResult設置爲等於該對象。那麼這是否將compResult轉換爲對象?

所以在我看來,compResult是一個接收[c1 add:c2]的結果的變量,但是當我們做[compResult print]時,我非常困惑,因爲我認爲你只能在發送消息(在這種情況下打印)到一個對象?

我想我的主要問題是在我們做compResult = [c1 add:c2]之後;是變量compResult持有/表示一個對象還是它實際上變成了對象?

+2

看起來你對於對象和指針有一些嚴重的困惑。你可能想看看一些初學者教程。 –

+0

感謝您的幫助。我現在正在閱讀一個初學者教程,所以我想我還沒有達到指針部分。你的回答確實能夠澄清一切。 – Brosef

回答

3

c1c2不是對象,它們是指向對象的指針。同樣,compResult也是一個指針,但在聲明時它是未初始化的,這意味着它不指向任何特定的對象。

當您通過[c1 add:c2]調用add:方法時,會創建一個新對象並返回指向它的指針。該指針被分配給compResultcompResult仍然只是一個指針,就像c1c2,但現在它指向這個新創建的對象,這意味着您可以將消息發送到該對象(如[compResult print]),就像您之前使用[c1 add:c2]一樣。

編者提示:從add:中返回一個自動釋放對象而不是您現在使用的保留對象會比較習慣。

1

無論c1也不c2的對象 - 他們兩人都是對象*引用,通過其聲明中的星號所示。它們與compResult的區別在於它們都在聲明時初始化,而compResult最初未初始化。

在作業compResult持有對在add方法內分配的對象的引用之後。在ARC下,默認情況下該變量被認爲是__strong,這意味着當compResult超出範圍時結果對象將被釋放。從技術上講,c1c2是指針,但是因爲在啓用ARC的代碼中,它們獲得了保留和釋放它們指向的對象的特殊權力,我稱它們爲「對象引用」。