2013-12-17 48 views
0

雖然我知道深拷貝和淺拷貝之間的主要區別,但我想問的是實用的東西。設置一個指向一個對象的指針爲零會影響對象或其他指針嗎?

NSArray *firstArray = [NSArray arrayWithObjects:@"first", @"second",@"third", nil]; 
NSArray *secondArray = firstArray; 
secondArray    = nil; 

NSLog(@"First Array : %@",firstArray); 
NSLog(@"Secon Array : %@",secondArray); 

無論是firstArraysecondArray具有通過把破發點所看到的相同的參考。現在

我的問題是這樣的,如果兩者都具有相同的參考那麼爲什麼如果secondArray改變時firstArray不會改變。

我真的很困惑... 任何人都可以讓我清楚。

感謝您的期待。

+0

[深度複製和深度複製之間的區別](http://learningwithdeepak.blogspot.in/2012/11/difference-between-shallow-copy-deep.html) –

+3

'secondArray'是指向「NSArray '把它設置爲'nil'就意味着數據不能再通過'secondArray'變量訪問,它不會破壞數據或阻止firstArray指向它。深/淺拷貝在這裏不是一個sisue - 當你有多個指向相同數據的原始指針時,不會進行拷貝。這就像擁有兩隻同一只狗的所有權證 - 撕裂一隻狗不會讓英鎊摧毀狗。 –

+0

@TonyD:對不起,我在想這是基本的OOP概念。 – user3085885

回答

3

我需要使用ASCII藝術來解釋這更好的...

firstArray 
      \ 
      \ 
      NSArray - the actual data 
      /
     /
secondArray 

firstArraysecondArray只是指針,拿着其中NSArray數據存儲在相同的數字(虛擬)內存地址。如果其中一個指針設置爲指向nil或針對該問題的其他某些數據,則不會觸發NSArray和其他指針的任何更改。

特別要注意的是,儘管firstArraysecondArray都在開始時保持相同的值,但它們在不同的存儲器地址處是不同的變量。你可以看到,如果打印:

NSLog(@"First Array : %@",&firstArray); 
NSLog(@"Secon Array : %@",&secondArray); 

我認爲你是他們的地址弄錯,他們指出,(在NSArray數據的地址)的地址,然後結束他們是同一個變量不同的名稱。他們不是!每個都有不同的內存。

你可能想在指針讀了起來:What does "dereferencing" a pointer mean?

指針和引用

指針變量更象是一個整型變量 - 它需要的內存幾個字節(無論物體的大小它可能會被指出)並存儲一個數字。該數字可以用來記錄(虛擬)存儲器地址(從(虛擬)存儲器的0原點開始的多少個字節),可以找到指向類型的特定對象。所以,這有點像一張紙,我們可以寫出房子的地址。現在,指針不是房子(數據對象),您可以隨時擦除原始地址並隨時寫出其他房屋的地址,並且可以使用該地址查找房屋。這就是在這個問題中發生的事情......你實際上有兩張「紙片」,你要「寫」你的「房子」的地址,然後抹去其中的一張,並且預計會有另一個戲劇性的影響一張紙被擦除和/或房屋/物體被毀壞。指針不能像那樣工作。

有些語言具有獨特的機制 - 在各種語言的術語中稱爲「引用」,「別名」,「鏈接」和許多其他內容 - 可以像對象的附加名稱或別名一樣工作。相反,您對這些對象之一「做」的任何事情都是透明地對該對象執行的。回到我們的房子的比喻:這就像爲你的房子寫了不同的名字 - 而不是使用街道地址,你可以稱之爲「家」或「我的城堡」,如果你給出指令「燒房」,你的房子將會真的很燙。有一個指向你家的指示 - 說「燒着指向家裏的東西」就會燒掉紙片,除非你花費額外的努力去「指引」指針並在房子上操作。

當它們需要在運行時繞過程序傳遞時,它們引用/別名/東西......通常像指針一樣實現 - 有效的變量存儲數據對象的地址。但是,無論它們是在運行時傳遞還是僅在編譯器的內部記錄中暫時存在,它們都如上所述運行。

因此,對於「參考」是用於描述這些參考/別名/任何事物的技術術語的人來說,聽到人們說指針是參考是「錯誤的」......我們的反應是「不是如果你這樣想的話,那麼你就會燒紙而不是房子。「但是,整個程序員羣體的「參照」是「指針」的另一個術語,這些其他的東西可能被稱爲「別名」或「鏈接」或「假名」,或者善良知道什麼,或者他們可能不會存在於該語言/社區(例如C程序員)。

我們在評論中的所有討論都是關於這種潛在的混淆。

重要的這是,你知道,在內存上的指針操作會影響數字地址指針商店,而不是指向的對象除非你解引用該指針,而不是其他指針到該對象(除非他們都是「智能指針」,並且有一些有意的協調同步)。

我建議你閱讀以上內容,直到你不能再閱讀它爲止,然後重新閱讀What does "dereferencing" a pointer mean?然後重讀這個等,直到你感到高興爲止,你已經掌握了一切。

您當前的理解

在下面的評論,你說:

了我的理解,指針是可以在它包含一個內存地址和內存地址總是需要在意義上的變量引用一個值。

在指針的存儲器地址可在點合法對象/值reference /,或者它可以未初始化或垃圾,只是作爲一個整數變量可以具有有用的數目在它或將未初始化(尚未設置),或認爲你不再有興趣在早期處理後的一些遺留的價值。

讓我清楚我的觀點在這裏,指針有一個內存地址,在這個內存地址會有一些值。

這是含糊不清,但正確,但你的意思是它。不明確的地方:指針具有存儲器地址,指針本身存儲在存儲器中。從這個意義上說,每個變量都有一個內存地址。但是,指針在指向數據的內存地址的意義上也有一個內存地址。 (這是我上面鏈接對方的回答解釋。)

所以,如果有人已經拿到該值,必須有一個參考到達那裏和參考是包含它的那點財產。

嗯,我認爲值,你的意思是poined-價值:你必須有一個「內存地址」到達那裏(是否要調用地址的引用上面所討論的),並且該地址存儲在指針,所以你可以認爲它是指針的「屬性」,如果你使用某些語言使用的「屬性」。所以是的! :-)我認爲你的理解可能是正確的,但是你的術語仍然有點不精確和含糊不清。

+0

這是否意味着,在內存級別,將有三個分配,分別爲firstArray,secondArray和NSArray(存儲數據)。 'firstArray'和'secondArray'都從內存中持有相同的'NSArray'引用嗎?我在這裏嗎? – user3085885

+0

@ user3085885是的,這是正確的。 (我說*「有效」*僅僅是因爲內部NSArray數據可能使用多個分配區域 - 我不知道,因爲我是一個C++程序員而不是Objective-C - 但它與這兩個指針無關)。您可能需要看到http://stackoverflow.com/questions/647260/deep-copying-an-nsarray –

+0

太棒了,我以完美的方式得到它。萬分感謝。 – user3085885

相關問題