官术网_书友最值得收藏!

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;
    }
主站蜘蛛池模板: 舟山市| 武陟县| 措美县| 扶余县| 邵东县| 秭归县| 闽侯县| 闵行区| 富蕴县| 潮安县| 长丰县| 文安县| 昭通市| 余姚市| 六盘水市| 化州市| 鄂伦春自治旗| 绥化市| 区。| 德兴市| 湛江市| 柏乡县| 莒南县| 永昌县| 天门市| 西畴县| 佛学| 海伦市| 阿鲁科尔沁旗| 大名县| 司法| 米泉市| 漾濞| 阜城县| 大丰市| 赣州市| 乐平市| 济阳县| 寿光市| 容城县| 安岳县|