對於初學者朋友,在OC指針指針修改對象屬性掌握起來一般問題不大的,但是要再來幾個"函數"和你"折騰"呢?哈哈!看看你又沒有中過槍吧!看下麵一段代碼:void test1(int newAge,double newHeight);void test2(Person *newP);void tes...
對於初學者朋友,在OC指針指針修改對象屬性掌握起來一般問題不大的,但是要再來幾個"函數"和你"折騰"呢?哈哈!看看你又沒有中過槍吧!看下麵一段代碼:
void test1(int newAge,double newHeight); void test2(Person *newP); void test3(Person *newP); void test4(Person *newP); int main(){ Person *p= [Person new]; p->_age = 10; p->_height = 1.2f; test1(p->_age, p->_height); [p print]; test2(p); [p print]; test3(p); [p print]; test4(p); [p print]; return 0; } void test1(int newAge,double newHeight) { newAge = 30; newHeight = 1.4; } void test2(Person *newP) { newP->_age = 20; newP->_height = 3.3; } void test3(Person *newP) { Person *p2 = [Person new]; p2->_height = 4.4; p2->_age = 50; newP = p2; newP ->_age = 60; } void test4(Person *newP) { Person *p2 = newP; p2->_age = 18; p2->_height = 5.1; newP->_age =25; }
自信的朋友可以默默的寫下你們的答案,我們來對下答案吧
age = 10,height = 1.200000
age = 20,height = 3.300000
age = 20,height = 3.300000
age = 25,height = 5.100000
原理:看一下原理之前,我們先要明白一件事:當創建一個對象後,系統會為我們做3件事情:1.會在堆中開闢一塊存儲空間(堆有個特性,就是不會自動釋放)2.會初始化對象屬性為零 3.會返回一個地址給對象(把每個屬性看出一個元素的話,那麼第0個元素是系統生成的地址"isa",這也就是對象的地址)
test1:在棧中開闢一塊存儲空間,把10和1.2f賦值給newAge和newHeight,函數調用結束後test1函數釋放
test2:把p賦值給Person *newP,那麼*newP就等於p了,相當於通過newP訪問p指向的存儲空間,函數調用結束後test2函數釋放
test3:(這一點我覺得比較複雜,也是容易進入誤區的地方) 把p的值賦值給test3中的newP,newP此時指向先開闢的[Person new],隨後test3中有個新指針p2指向堆中新開闢的[Person new],之後又把p2的值賦值給newP(也就算說覆蓋了原來的地址),那麼newP就是指向後開闢的[Person new],所以再通過newP訪問的age是後開闢的[Person new]中的age,不會影響先開闢的[Person new]中的屬性,但此時上面已經調用了test2了,所以屬性結果和上面相同.
test4:相當於直接把newP賦值了p2,無論通過p2還是newP來修改對象屬性都是一回事.
如有還是想不清楚的話,自己畫個圖理解可能比較容易,也可以和我進一步討論,一起進步!
好了,今天就到這了,如有不正之處,還望各位看官之處,感激不盡!
----奈文摩爾