OC 屬性 深複製 淺複製

2021-07-22 16:07:48 字數 2663 閱讀 8495

main.m

#import 

#import "human.h"

int main(int argc, const

char * argv)

return

0;}

human.h

#import 

@inte***ce

human : nsobject

//@property (null_resettable ,nonatomic, copy) nsstring *name;

@property (nonatomic, assign, getter=islogin) bool login;

@property (nonatomic, assign) nsinteger age;

@end

/* 第一類:執行緒有關

nonatomic:非原子性 與執行緒無關,通常用於單執行緒,速度較快。一般使用該關鍵字。

atomic(預設): 原子性 與執行緒有關,通常用於多執行緒。

第二類:記憶體管理有關

strong = retain

weak = assign

retain:修飾的物件型別,需要記憶體管理

assign(預設):基本資料型別,無需記憶體管理

copy:修飾物件型別,與記憶體管理有關,推薦nsstring型別使用copy修飾

第三類:setter,getter

readonly:只能呼叫getter方法,取值

readwrite(預設):setter,getter方法都能使用

getter= :給getter方法重寫命名,一般使用在bool型別。

第四類:可空型別

nonnull:屬性值不能為nil

nullable(預設):屬性值可以為空

ios5 之前

1.宣告下劃線成員變數

2.宣告屬性

3.屬性和和成員變數名關聯(@synthesize)

ios5 之後

1.自動生成下劃線成員變數

2.自動生成setter,getter的方法宣告和實現

3.無需使用@synthesize將屬性和成員變數名進行關聯

如果手動實現了setter,getter方法中的某乙個,系統會自動將另乙個方法配齊。

如果手動實現setter,getter,需新增@synthesize name = _name;

*/

human.m

#import "human.h"

@implementation

human

@synthesize name = _name;

- (void)setname:(nsstring *)name

- (nsstring *)name

//無需宣告和手動呼叫

- (nsstring *)description

@end

//位址相同

nsstring *string = @"hello";

nsstring *object = [string copy];

nslog(@"copy = %@",object);

//淺複製:指標複製

nslog(@"string = %p,object = %p",string,object);

//位址不同

nsmutablestring *mutablestring = [nsmutablestring stringwithformat:@"world"];

nsstring *object1 = [mutablestring copy];

//深複製:內容複製,複製後產生新的物件。

nslog(@"mutable = %p, object1 = %p",mutablestring, object1);

//copy對於可變物件,是深複製,對於不可變物件,是淺複製。

//copy後返回的物件都是不可變物件

nsstring *string = [[nsstring alloc] initwithformat:@"hello"];

nsmutablestring *object = [string mutablecopy];

[object insertstring:@"y" atindex:1];

nslog(@"object = %@",object);

nslog(@"string = %p, object = %p",string, object);

nsmutablestring *mutablestring = [nsmutablestring stringwithformat:@"world"];

nsmutablestring *object1 = [mutablestring mutablecopy];

[object1 insertstring:@"u" atindex:2];

nslog(@"object1 = %@",object1);

nslog(@"mutablestring = %p, object1 = %p",mutablestring, object1);

//mutablecopy對於可變物件或不可變物件都是深複製。並且返回的物件都是可變的。

淺複製 深複製

second,來說說shallow copy and deep copy的定義和我自己的一些理解。僅供參考 淺複製 shallow copy 如果欄位是值型別的。則對該字段執行逐位複製,如果欄位是引用型別,則複製引用但不複製引用的物件 因此,原始物件及其副本引用同一物件。即被複製物件的所有變數都含有...

深複製 淺複製

深複製又叫深拷貝 淺複製又叫淺拷貝 位拷貝。為了理解什麼叫深複製和淺複製,我們舉乙個例子,假如我們有乙個類叫cdemo,有兩個成員,a 和 str.class cdemo 我們再定義乙個建構函式 cdemo int pa,char cstr 然後執行 cdemo a 10,hello cdemo b...

深複製淺複製

淺複製 所謂的淺拷貝就是拷貝指向物件的指標,意思就是說 拷貝出來的目標物件的指標和源物件的指標指向的記憶體空間是同一塊空間.淺拷貝只是一種簡單的拷貝,讓幾個物件公用乙個記憶體,然而當記憶體銷毀的時候,指向這個記憶體空間的所有指標需要重新定義,不然會造成野指標錯誤 深複製所謂的深拷貝指拷貝物件的具體內...