首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Objective-C 對象複製:淺拷貝與深拷貝詳解

     編輯:關於C語言

核心概念

對象複製分為淺拷貝和深拷貝,理解兩者區別至關重要。

淺拷貝示例

NSMutableArray *array1 = [NSMutableArray arrayWithObjects:@"a", @"b", nil];
NSMutableArray *array2 = array1;  // 僅複製指針
[array2 addObject:@"c"];

// 遍歷 array1 輸出:a, b, c
// 原因:array1 和 array2 指向同一塊內存區域

淺拷貝只是複製指針,雙方指向同一對象,修改其中一個會影響另一個。

深拷貝

若需修改副本不影響原對象,必須使用深拷貝。分為:

  • 不可變拷貝:copy 方法,產生不可變對象(如 NSArray、NSString)。
  • 可變拷貝:mutableCopy 方法,產生可變對象(如 NSMutableArray、NSMutableString)。

系統類 vs 自定義類

系統類(NSArray、NSString 等)

直接調用 copy / mutableCopy 即可。

自定義類

需遵循 NSCopying 協議,實現兩個方法:

// 不可變拷貝
- (id)copyWithZone:(NSZone *)zone {
    MyClass *new = [[MyClass allocWithZone:zone] init];
    new.string = self.string;  // 根據屬性屬性決定是 assign/retain/copy
    return new;
}

// 可變拷貝
- (id)mutableCopyWithZone:(NSZone *)zone {
    MyClass *new = [[MyClass allocWithZone:zone] init];
    new.string = self.string;
    return new;
}

深拷貝本質

深拷貝會重新分配內存空間,用原對象的值進行初始化,而非共享同一塊內存。這樣修改副本不會影響原對象。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved