2012/08/21

objectiv-C 中 retain/copy/assign的含義

原文:新手入門,請給講一下retain/copy/assign的含義,三樓回文

舉個例子
NSString *pt = [[NSString alloc] initWithString:@"abc"];

上面一段代碼會執行以下兩個動作
1. 分配一段記憶體空間用來存儲@"abc"  譬如:記憶體位址為:0X1111,內容為 "abc"
2. 分配一段記憶體空間用來存儲pt  譬如:記憶體位址為:0Xaaaa,內容自然為0X1111

接著分別比較assign、retain、copy

assign的情況:
NSString *newPt = [pt assign];
此時newPtpt完全相同:地址都是0Xaaaa、內容為0X1111。即newPt只是pt的別名,對任何一個操作就等於對另一個操作。 因此retainCount不需要增加。

retain的情況:
NSString *newPt = [pt retain];
此時newPt的地址不再為0Xaaaa,可能為0Xaabb,但是內容依然為0X1111。 因此newPtpt 都可以管理"abc"所在的記憶體。因此 retainCount需要增加1。

copy的情況:
NSString *newPt = [pt copy];
此時會在堆上重新開闢一段記憶體存放@"abc", 比如0X1122 內容為@"abc" ,同時會在記憶體上為newPt分配空間。譬如地址:0Xaacc 內容為0X1122 ,因此retainCount增加1,供newPt來管理0X1122這段記憶體位址。

沒有留言:

張貼留言