內存泄漏 : 應當廢棄的對象在超出生命周期后繼續存在
內存管理 : 遵守配對原則,有alloc/new/copy/mutableCopy就要有相對應的release或autorelease
原因 : Oc對象是在堆里面的(動態分配),堆里面的內存由我們程序員來管理 ;
對象操作 | Objective –c 對應方法 |
生成并持有對象 | alloc/new/copy/mutableCopy等 |
持有對象 | retain 方法 |
釋放對象 | release方法 |
廢棄對象 | dealloc方法(系統自動調) |
內存管理的思考方式 (文中“自己”表示 : “對象的使用環境”或“開發人員”):
1.自己生成的對象,自己持有
2.非自己生成的對象,自己也能持有
3.不再需要自己持有的對象時釋放
4.非自己持有的對象無法釋放
總結 :
1.調用alloc或是retain方法之后,引用計數值 + 1
2.調用release方法之后,引用計數值 - 1
3.當引用計數值為0時,調用dealloc方法廢棄對象
4.調用retianCount,可以返回引用計數器的個數
多對象內存管理步驟:(使用@PRoperty就會生成下面的set方法)
1.在set方法中調用傳進來的參數 retain方法
-(void)setRoom(Room*)room
{
if(_room != room){//判斷傳進來的對象是否是當前的對象
[_room relase];//釋放掉當前的對象
_room = [room retain];//引用新的對象,賦值
}
2.在dealloc方法中調用release
-(void)dealloc
{
[_room release];
_room = nil;
[super dealloc];
}
autorelease 使用方法:
#import和@class的使用 :
#import :包含所有的信息,包含引用類的變量和方法
@class : 可以簡單地引用一個類(僅僅告訴編譯器,這個是一個類)
@class和#import的主要區別 : #import的內容改變了就要拷貝一次。
如何使用 :
(1)在.H文件中使用@class
(2)在.M文件中是用得是#import,真正使用的時候才要#import
解決相互引用(retain): 一端用retain,一端用assign
常見知識點或注意點:
(1)剛創建一個對象的計數器就為1
(2)重寫deallloc方法的時候 : [super dealloc]必須放在最后面
(3)如果釋放了對象,把所指向的地址賦值為nil,可以防止野指針操作
(4)給空指針發送消息是不會出錯的,沒有什么現象
(5)調用retain方法會返回對象本身
(6)指針賦值并沒有調用retain,需要手動調用retain
(7)@property 生成set方法已經實現了上面的set方法和get方法,assign是默認的寫法
(8)取得一個非自己生成并自己持有的對象 : id obj=[NSMutableArray array]; 持有對象 : [obj retain];(類方法里面自動調了autorelease)
(9)如果使用非自己持有的對象,這個程序會崩潰。
(10)__weak (只能用于ios5以上):可以避免循環引用,__修飾的變量不持有對象
(11)占用內存較大的不要放在autoreleasepool,性能問題
(12)重寫alloc 方法的時候一定要使用self,這樣子類也可以創建相對應的對象
(13)instancetype,比id更加智能,可以在編譯的時候就可以發現問題
(14)如果直接使用 __weak UIView * view = [[UIView alloc]init];會發出警告 : Assigning retained object to weak variable……
(15)弱應用優點 : 在持有某對象的弱引用的時,若該對象被廢棄,則弱引用將會自動失效且處于nil(被賦值的狀態)相對于__unsafe_unretained更安全
(16)非OC對象是放在棧中,指針變量(4個字節)存在棧中
(17) A.h里#import “B”,B.h里#import “A”,導致錯誤 (Unknown type name……)
新聞熱點
疑難解答