舉個例子
NSString *pt = [[NSString alloc] initWithString:@"abc"];
上面一段代碼會執行以下兩個動作
1. 分配一段記憶體空間用來存儲@"abc" 譬如:記憶體位址為:0X1111,內容為 "abc"
2. 分配一段記憶體空間用來存儲pt 譬如:記憶體位址為:0Xaaaa,內容自然為0X1111
接著分別比較assign、retain、copy
assign的情況:
NSString *newPt = [pt assign];此時newPt和pt完全相同:地址都是0Xaaaa、內容為0X1111。即newPt只是pt的別名,對任何一個操作就等於對另一個操作。 因此retainCount不需要增加。
retain的情況:
NSString *newPt = [pt retain];此時newPt的地址不再為0Xaaaa,可能為0Xaabb,但是內容依然為0X1111。 因此newPt 和 pt 都可以管理"abc"所在的記憶體。因此 retainCount需要增加1。
copy的情況:
NSString *newPt = [pt copy];此時會在堆上重新開闢一段記憶體存放@"abc", 比如0X1122 內容為@"abc" ,同時會在記憶體上為newPt分配空間。譬如地址:0Xaacc 內容為0X1122 ,因此retainCount增加1,供newPt來管理0X1122這段記憶體位址。