黑馬程式員-------Objective-C基礎3

來源:互聯網
上載者:User

標籤:

------ android培訓、java培訓、期待與您交流! ----------

1.OC記憶體管理

1)範圍:管理任何繼承NSObject的對象,對其他的基礎資料型別 (Elementary Data Type)無效(堆區),否則會造成記憶體泄露

2)原理:任何對象都可能有用一個或多個所有者,只要一個對象至少還擁有一個所有者,它就會繼續存在

3)對象的引用計數器,retain(+1)、release(-1)、retainCount得到引用計數器的值

4)記憶體管理的分類:MRC(手動管理)、ARC(自動管理)、記憶體回收(不支援)

2.引用計數器的使用

dealloc:釋放對象

先調用[super dealloc]

我們建立一個項目,預設是ARC模式,先修改

////  main.m//  記憶體管理////  Created by fanyafang on 15/11/6.//  Copyright © 2015年 itcast. All rights reserved.//#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) {    @autoreleasepool {                Person *p =[[Person alloc]init];                NSUInteger count=[p retainCount];                NSLog(@"%lu",count);                //Person *p2=p;//不變        //Person *p2=[p retain];//加1        [p retain];//加1        [p release];//減一        [p release];//減一自動調用dealloc方法        //證明p的空間被釋放,可以在Person類中重寫dealloc方法    }    return 0;}

3.記憶體管理的原則

1)只要有人使用這個對象,這個對象就不會被回收

2)只要你想使用這個對象,那麼就應該讓這個對象的引用計數器加1

3)當你不想使用這個對象時,應該讓對象的引用計數器減1

4)誰建立(new、malloc、copy)誰release

5)誰retain誰release

4.如果一個對象已經被釋放了,這個對象就成為殭屍對象,再去使用這個對象就沒有意義,預設不報錯,需要開啟殭屍對象檢測

不能使用retain讓殭屍對象起死回生

5.對象nil 類Nil NULL NSNull是一個對象

避免使用殭屍對象的方法是,對象釋放以後,給對象賦值為nil

6.多個對象的記憶體管理

在set函數中先release執行個體對象,再retain傳入的對象

//如果是同一個對象的話就不需要release和retain

if(_car!=car){

  [_car release];

  _car=[car retain];

}

在dealloc中,release執行個體對象

[_car release];

[email protected]參數

1.原子性atomic  nonatomic

2.讀寫readwrite readonly

3.記憶體管理assign retain copy

替換get方法名稱setter=isVip,get方法名稱getter=isVip

[email protected]的使用

使用import引入標頭檔時,如果標頭檔的內容發生了變化,此時所有引用這個標頭檔的類都需要重新編譯

使用@class 類名;代替import

告訴編譯器xxx是一個類,不需要重新編譯

但是使用時會有提示錯誤,解決辦法,在.m檔案中再import一次

@class的可以解決迴圈引入問題,A類和B類互相import,使用class不會報錯

9.迴圈retain會導致兩個對象都會記憶體泄露

防止方法:1)讓某個對象多釋放一次(注意順序)

2)推薦方法:一端使用assign,另一端使用retain

10.NSString對象

[email protected]

如果一個方法需要放回一個建立的對象,該對象何時釋放?

方法內部不會釋放,因為這樣做會將對象立即釋放而返回一個Null 物件,調用者也不會主動釋放該對象

這個時候就發生了記憶體泄露

1)@autoreleasepool {}建立自動釋放池

2)[對象 autorelease];//加入自動釋放池,發送訊息,釋放池結束的時候調用對象的release

 

黑馬程式員-------Objective-C基礎3

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.