- Objective-C和Sprite Kit游戲開發從入門到精通
- 曹化宇
- 781字
- 2021-01-07 18:57:43
4.8 對象復制與傳遞
我們已經討論了在Objective-C中如何創建類、如何創建類的實例(對象),以及類的繼承等相關主題;接下來我們會討論一些關于類和對象的應用問題。
■4.8.1 對象的復制
接下來,我們將繼續使用CRobot類來演示對象的應用問題。首先,看下面的代碼,我們會使用賦值運算符來復制對象。
CRobot *robot5 = [[CRobot alloc] init]; robot5.name = @"No.5"; CRobot *robot6 = [[CRobot alloc] init]; robot6 = robot5; NSLog(@"%@ , %@\n", robot5.name, robot6.name); // robot6.name = @"No.6"; NSLog(@"%@ , %@\n", robot5.name, robot6.name);
從代碼執行的結果中,我們可以看到,第一個NSLog()函數顯示“No.5 , No.5”。然后,當我們修改robot6.name的值以后,第二個NSLog()函數顯示“No.6 , No.6”,也就是說,當我們修改robot6對象的值時,robot5對象的值也“變化”了,這是為什么呢?
實際上,我們說過,對象就是指針!當我們將一個對象賦值給另一個對象時,實際執行的是“淺復制”,也就是復制了對象的指針(引用),這樣,代碼中的robot5和robot6對象實際上是指向同一內存區域,也就是同一個對象體。所以,當我們修改其中一個對象的值時,實際會同時反映到兩個對象的引用中。
如果我們需要完全復制一個全新的對象,即對象的“深復制”操作,有兩個方法,一個方法是通過實現NSCopying協議,另一個方法就是通過歸檔來實現,稍后,我們會討論相關內容。
■4.8.2 對象作為參數
我們已經看到對象在賦值時的默認表現,即進行淺復制,而這一特性在對象作為函數或方法的參數時也會有著相同的表現。通過對象向函數或方法傳遞數據時,實際上傳遞的是對象的引用,此時,在函數或方法中對這個對象的操作應該注意:
? 通過引用傳遞對象,可以提高數據的傳遞效率,因為只傳遞指針,而不需要復制全部數據。
? 在函數或方法中對于對象的修改,會直接反映到外部對象,應注意代碼的目的是否確實是這樣。
下面的代碼,演示了CRobot對象作為函數參數的應用,大家可以在main.m文件中進行相關測試。首先是robotRename()函數,如下面的代碼。
void robotRename(CRobot* robot) { if (robot ! = nil) robot.name = @"新的名字"; }
接下來,我們在main()函數中使用robotRename()函數,如下面的代碼。
int main(int argc, const char * argv[]) { @autoreleasepool { CRobot *robot5 = [[CRobot alloc] init]; robot5.name = @"No.5"; robotRename(robot5); NSLog(robot5.name); } return 0; }
- 完全掌握Office 2010高效辦公超級手冊
- InDesign CS6中文版基礎與實例教程
- Excel VBA語法辭典
- Word/Excel/PPT 2010辦公應用從入門到精通
- Word/Excel/PPT/PS/移動辦公Office 5合1無師自通
- 普通WPS Word規范排版公文格式
- 新編Word/Excel/PPT 2016高效辦公三合一(全彩版)
- Matlab R2016a從入門到精通 (CAX工程應用叢書)
- PPT演義:100%幻燈片設計密碼
- Excel公式、函數、圖表與數據處理應用大全(全新版)
- MATLAB及Mathematica軟件應用
- 人事管理政務網上公開的發展與對策
- 辦公自動化全能一本通
- Excel統計分析:方法與實踐
- Word/Excel/PPT 2016辦公三合一傻瓜書