iPhone開發(fā)中如何使內(nèi)存合理使用
iPhone開發(fā)中如何使內(nèi)存合理使用是本文要介紹的內(nèi)容,只要是來學(xué)習(xí)iphone開發(fā)中內(nèi)存的管理。iPhone開發(fā)過程中,內(nèi)存的使用至關(guān)重要。不但要合理分配使用內(nèi)存,還要注意內(nèi)存泄露的問題, 因為內(nèi)存泄露會導(dǎo)致程序由于內(nèi)存不足而崩潰。根據(jù)個人開發(fā)的經(jīng)驗來看,在開發(fā)iPhone程序的過程中,關(guān)于內(nèi)存的問題需要注意以下幾點:
內(nèi)存分配、釋放成對出現(xiàn)
使用 alloc 分配的內(nèi)存對象需要在用完后 調(diào)用release釋放
注意copy,retain,assign操作符的區(qū)別
copy, retain操作符賦值的對象和alloc一樣,需要release釋放,否則會導(dǎo)致內(nèi)存泄露
assign 操作符的含義是將對象指向另一對象, 兩者指向的是同一內(nèi)存對象,無需調(diào)用release釋放
NSArray, NSDictionary, NSMutableArray, NSMutableDictionary等容器類, 在使用這些容器類的時候要注意, 在添加對象到這些類對象時,容器類會自動調(diào)用一次retain,比如
- NSString* string = [[NSString alloc] initWithString:@”test string”]; // refCount = 1
- NSArray* array = [NSArray array];
- [array addObject:string]; // refCount = 2
- [string release]; // refCount = 1
這種情況, 即便string已經(jīng)調(diào)用release,但是在加入 array中時已經(jīng)調(diào)用了一次retain,注意refCount的變化
簡單介紹一下iPhone 或者說Objective C對對象的管理機制。 OC中采用一種引用計數(shù)refCount的方式來管理內(nèi)存對象,當refCount等于0的時候就會釋放對象所占的內(nèi)存, 操作符alloc,copy, retain都會將refCount加1表示引用計數(shù)增加, 而調(diào)用release使 refCount自動減1, 當refCount=0時表示該對象已經(jīng)沒有被引用,可以將其釋放, 之后該對象便不可用
連續(xù)重復(fù)分配內(nèi)存的過程***創(chuàng)建自己的自動釋放池 NSAutoreleasePool,通常是在for、while等循環(huán)操作過程中,比如
- for( int i=0; i < 100; i++ )
- {
- NSString* str = [[NSString alloc] initWithString:@”some string”];
- // 針對str的操作
- [str release];
- }
在這種情況下,有2點需要注意,首先如果可能,就把str的分配、釋放放在for循環(huán)外面, 從而減少內(nèi)存的分配、釋放導(dǎo)致程序效率低下,也利于內(nèi)存回收,如上例應(yīng)該為
- NSString* str = [[NSString alloc] initWithString:@”some string”];
- for( int i=0; i < 100; i++ )
- {
- // 針對str的操作
- }
- [str release];
如果實際情況復(fù)雜,不能像例子中那樣抽離出循環(huán)外,需要創(chuàng)建自己的內(nèi)存管理池, 同樣適用于需要大量autorelease對象的過程
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
- for(int i=0; i < 100; i++ )
- {
- // actions
- }
- [pool release];
之所以要這樣做,是因為apple處理iPhone的內(nèi)存管理機制問題, 通常情況下,系統(tǒng)會在需要的時候釋放整理所有的autorelease對象,這就是為什么有時候autorelease對象在作用域范圍外還有可能是有效 的
避免不常用對象駐留內(nèi)存, 桌面開發(fā)的tx很多喜歡在程序初始化的時候?qū)⒛承┵Y源比如小圖片加載進內(nèi)存,從而提高程序運行效率。 但這種方式在iPhone以及其它mobile移動設(shè)備開發(fā)時需要避免,因為對于這些設(shè)備來說,內(nèi)存永遠顯得不足(當然普通pc內(nèi)存也是越大越好:) )。 按照apple的官方說法, Load resources lazily . 就是在需要的時候再從硬盤上讀取,而避免常駐內(nèi)存。
小結(jié):iPhone開發(fā)中如何使內(nèi)存合理使用的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對你有所幫助!