retain\assign\copy的區別

舉個例子:
NSString *str = [[NSString alloc] initWithString:@'abc'];
上面一段代碼會執行以下兩個動作:
1 在堆上分配一段內存用來存儲@'abc' ,比如:內存地址爲0X1111 內容爲 'abc'
2 在棧上分配一段內存用來存儲str,比如:地址爲0XAAAA 內容自然爲0X1111

下面分別看下(assign,retain,copy):
1.assign的情況:NSString *newStr = [str assign];
此時newStr和str完全相同,地址都是0XAAAA ,內容爲0X1111 ,即newStr只是str的別名,對任何一個操作就等於對另一個操作。因此retainCount不需要增加.
2.retain的情況:NSString * newStr = [str retain];
此時newStr的地址不再爲0XAAAA,可能爲0XAABB,但是內容依然爲0X1111.因此newStr和str都可以管理'abc'所在的內存。因此 retainCount需要增加1.
3.copy的情況:NSString * newStr = [str copy];
此時會在堆上重新開闢一段內存存放@'abc',比如0X1122,內容爲@'abc,同時會在棧上爲newStr分配空間,比如地址:0XAACC,內容爲0X1122,因此retainCount增加1供newStr來管理0X1122這段內存.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章