雖然現(xiàn)在我們做開發(fā)走到使用ARC 自動引用計數(shù)妻味,但是更好地去了解內(nèi)存管理還是非常有必要的药蜻。
??手機的內(nèi)存是有限的瓷式,當分配的內(nèi)存講手機內(nèi)存都占用后,手機會崩潰導致手機應(yīng)用崩潰语泽,所以贸典,我門需要合理地釋放手機內(nèi)存來保證手機應(yīng)用不會崩潰。
??比如我們創(chuàng)建了一個類踱卵,在類中創(chuàng)建了一個 lisi 的對象廊驼,這樣逗需要給這個對象分配內(nèi)存,分配好內(nèi)存之后惋砂,就會使用它的內(nèi)存妒挎,為了保證內(nèi)存空間有良好的持續(xù)實用性,我們需要在 lisi這個對象使用完畢后西饵,釋放它所占用的內(nèi)存饥漫,我們可以看如下的代碼演示來說明:
BLPerson *lisi = [[BLPerson alloc] initWithName:@"lisi" age:30];
[lisi sayMyInfo];
[lisi setName:@"李斯"];
[lisi setAge:90];
NSString *lisiName = [lisi name];
NSInteger lisiAge = [lisi age];
NSLog(@"lisiName: %@, lisiAge: %li", lisiName, lisiAge);
[lisi release]; // 這樣還不等于釋放了 lisi,這樣僅僅代表對象 lisi 的引用計數(shù) 減去了 1個罗标,
// 如果 lisi 本身沒有再被其他對象所引用的話(引用計數(shù)為0),則 對象 lisi 會被釋放积蜻,
// 不然代表它還有別的擁有者闯割,不會被釋放。
內(nèi)存機制其時就是引用計數(shù)的機制竿拆。當對象的引用計數(shù)為零的時候宙拉,就會由系統(tǒng)去調(diào)用與 alloc 相反的函數(shù),即 dealloc 函數(shù)丙笋,去釋放內(nèi)存谢澈。并且當你使用了 alloc, copy, retain 的話都要對應(yīng)的使用一個 release(保持平衡御板,保證不用的時候锥忿,引用計數(shù)最后為0)。
#import "BLPerson.h"
@implementation BLPerson
- (void)dealloc
{
self.name = nil;
[super dealloc]; // 這行代碼在 dealloc 中一定要寫怠肋,還得放在最后敬鬓。父類需要被釋放。
}
比如你在類文件中聲明了一個類方法+(instance) ,在別的文件中調(diào)用這個方法钉答,當使用完之后础芍,你希望可以釋放它,那么直接在下面 release是否合適呢数尿?其實仑性,這樣是不合適有問題的。因為有時候右蹦,你調(diào)用的是網(wǎng)上的SDK诊杆,你不知道在你調(diào)用的文件里面,它是否已經(jīng)進行了釋放的操作嫩实。一旦在你調(diào)用的SDK中刽辙,它已經(jīng)做了釋放的代碼輸入,而你又在自己的文件中進行了 release 的操作甲献,這樣 引用計數(shù)在0的情況下又要減去1宰缤,這樣就叫做非法訪問,也會造成系統(tǒng)崩潰晃洒,那么我們應(yīng)該怎么做呢慨灭?這時候就需要引入 autorelease 方法,即在類文件中 最后 return 某個類的時候球及,比如一個BLPerson 類氧骤,應(yīng)該寫成 return [person autorelease];
??或者這樣,也可以:
+ (BLPerson *)createPerson
{
BLPerson *person = [[[BLPerson alloc] initWithName:@"未設(shè)置" age:0] autorelease];
return person;
}
這個是自動釋放池吃引,當系統(tǒng)發(fā)現(xiàn)這個內(nèi)存不再被使用的時候筹陵,會自動對在自動釋放池中的對象 引用對象 -1。
以上內(nèi)容是在使用MRC 手動引用管理的時代需要注意的內(nèi)容(可以在項目工程 的設(shè)置中進行設(shè)置镊尺,從 ARC 轉(zhuǎn)為 MRC)朦佩。
??有兩個最常見的應(yīng)用崩潰現(xiàn)象:數(shù)組越界 和 非法訪問(內(nèi)存已經(jīng)釋放,地址值還在并訪問)庐氮。(weak 比 assign 要安全语稠,前者會將地址值改變?yōu)?xo,訪問后是安全的弄砍,不會造成非法訪問仙畦。后者做不到這樣)
??注意當在頭文件中聲明了某個方法,也需要在實現(xiàn)文件中去實現(xiàn)音婶,不然雖然可以調(diào)用慨畸,但用戶使用的時候?qū)嶋H上是會造成崩潰(閃退)的(如果這個方法在父類中實現(xiàn)了,它就不會崩潰)衣式。