
圖片源于網(wǎng)絡(luò)
我們先看一個(gè)實(shí)例變量imgv的初始化:
UIImageView * imgv=[[UIImageView alloc]init];
imgv是指針,指針指向的是對(duì)象。
[[UIImageView alloc]init]; 創(chuàng)建了一個(gè)對(duì)象
imgv = 寫(xiě)在前面,等于把imgv指向了那個(gè)對(duì)象。所以imgv是指針
而對(duì)象藏在內(nèi)存的某個(gè)角落里面,需要通過(guò)指針來(lái)訪問(wèn)
指針指向了對(duì)象在內(nèi)存中的一個(gè)地址,通過(guò)這個(gè)指針找到內(nèi)存中的對(duì)象(通過(guò)指針來(lái)找到對(duì)象而不是表示對(duì)象)
本質(zhì)上講:類(lèi)是一種指針類(lèi)型的變量,上述定義的UIImageView* 類(lèi)型只是存放一個(gè)地址值,它指向?qū)嶋H的UIImageView對(duì)象,而真正對(duì)UIImageView對(duì)象則存放堆(heap)內(nèi)存中。(所有對(duì)象都只能通過(guò)指針變量來(lái)訪問(wèn)它們。)
堆內(nèi)存中可以有多個(gè)指針,即多個(gè)指針指向同一對(duì)象。
NSMutableString *str = [@"string1" mutableCopy];
NSMutableString *str2 = str;
[str appendString:@"__str"];
[str appendString:@"__str2"];
NSLog(@"str1:%@ str2:%@",str,str2);
//輸出:str1:string1__str__str2 str2:string1__str__str2
NSLog(@"str1:%X str2:%X",str,str2);
//輸出:str1:B3D96B60 str2:B3D96B60
- 如果堆內(nèi)存里的對(duì)象沒(méi)有任何變量指向該對(duì)象,那么程序就無(wú)法訪問(wèn)該對(duì)象,就要釋放內(nèi)存,否則就造成內(nèi)存泄漏。