- 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; }
- Word/Excel/PPT 2007辦公技巧
- 新編Office 2016從入門到精通
- Word Excel PPT商務辦公從新手到高手(白金全彩版)
- 快·易·通:2天學會PPT幻燈片設計與制作(2016版)
- 非常Easy:Excel財務高效管理
- 微軟辦公軟件國際認證(MOS)Office 2010大師級通關教程(第2版)
- Excel辦公高手應用技巧
- PowerPoint 2013從入門到精通
- 文秘辦公自動化培訓教程
- Excel市場分析應用之道
- PowerPoint 2010辦公專家從入門到精通(精編版)
- 和秋葉一起學:秒懂Word
- 圖表之美:打造優秀的Excel圖表
- Excel2010辦公專家從入門到精通(精編版)
- PowerShell for Office 365應用實戰