一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - IOS - 簡單講解Objective-C的基本特性及其內存管理方式

簡單講解Objective-C的基本特性及其內存管理方式

2021-01-04 18:06文頂頂 IOS

這篇文章主要介紹了簡單講解Objective-C的基本特性及其內存管理方式,雖然Swift語言出現后iOS和Mac OS應用開發方面Objective-C正在成為過去時,但現有諸多項目仍然在使用,需要的朋友可以參考下

一、oc簡介

oc語言在c語言的基礎上,增加了一層最小的面向對象語法,完全兼容c語言,在oc代碼中,可以混用c,甚至是c++代碼。

可以使用oc開發mac osx平臺和ios平臺的應用程序。

拓展名:c語言-.c  oc語言.-m  兼容c++.-mm

注:其實c語言和oc甚至任何一門語言都只是我們為了實現一些功能,達到一些效果而采用的工具,拋開語法的差別外,我想最重要的應該是在解決問題的時候考慮的角度和方法不一樣而已,然而這也構成了學習一門語言的重要性。

 

二、語法預覽

(1)關鍵字

基本上所有的關鍵字都是以@開頭的(為了與c語言的關鍵字區分開來),如@interface  @implementation  @public等,少部分沒有以@開頭,如id,_cmd等

 

(2)字符串以@開頭

c語言字符串:“hello”

oc語言字符串:@“hello”

 

(3)其他語法

基本類型:5種,增加了布爾類型

nil相當于是null,也就是0。

屏幕輸出:nslog(@“hello”);//自動換行

nslog(@“age is %d”,2);

 

三、oc程序開發過程

#import預處理指令有兩個作用:(1)與#include一樣,拷貝文件內容(2)可以自動防止文件的內容被重復拷貝

程序編譯連接過程:

源文件(.m)---(編譯)---->目標文件(.0)-----(鏈接)---->可執行文件(.out)

 

foundation框架。如果要使用框架中的所有頭文件那么應該怎么辦?包含框架的主頭文件。主頭文件是一個框架中最主要的頭文件,每個框架的主頭文件名和框架名一致。

如#import<foundation/foundation.h>

運行過程如下:

(1)編寫oc源文件  .m .c

(2)編譯文件  cc -c xx.m  xxx.c

(3)鏈接  cc xx.o xxx.o  -framework foundation

(4)運行 ./a.out

 

四、類型補充

復制代碼 代碼如下:


int main()

 

{

bool b=yes;

bool b1=no;

bool b2=1;//  yes

bool b3=2;//  no

nslog(@“%i”,b);

}


 

 

bool類型與其他類型的用法一致,bool類型的本質是char類型的,定義如下:

復制代碼 代碼如下:

typedef signed char bool


宏定義:

復制代碼 代碼如下:


#define yes  (bool)1

 

#define no   (bool)0


布爾類型的輸出一般當做整數來用。

 

五、內存管理
1、基本原理

(1)為什么要進行內存管理。

由于移動設備的內存極其有限,所以每個app所占的內存也是有限制的,當app所占用的內存較多時,系統就會發出內存警告,這時需要回收一些不需要再繼續使用的內存空間,比如回收一些不再使用的對象和變量等。

管理范圍:任何繼承nsobject的對象,對其他的基本數據類型無效。

本質原因是因為對象和其他數據類型在系統中的存儲空間不一樣,其它局部變量主要存放于棧中,而對象存儲于堆中,當代碼塊結束時這個代碼塊中涉及的所有局部變量會被回收,指向對象的指針也被回收,此時對象已經沒有指針指向,但依然存在于內存中,造成內存泄露。

 

(2)對象的基本結構

每個oc對象都有自己的引用計數器,是一個整數表示對象被引用的次數,即現在有多少東西在使用這個對象。對象剛被創建時,默認計數器值為1,當計數器的值變為0時,則對象銷毀。

在每個oc對象內部,都專門有4個字節的存儲空間來存儲引用計數器。

 

(3)引用計數器的作用

判斷對象要不要回收的唯一依據就是計數器是否為0,若不為0則存在。

 

(4)操作

給對象發送消息,進行相應的計數器操作。

retain消息:使計數器+1,改方法返回對象本身

release消息:使計數器-1(并不代表釋放對象)

retaincount消息:獲得對象當前的引用計數器值

 

(5) 對象的銷毀

當一個對象的引用計數器為0時,那么它將被銷毀,其占用的內存被系統回收。

當對象被銷毀時,系統會自動向對象發送一條dealloc消息,一般會重寫dealloc方法,在這里釋放相關的資源,dealloc就像是對象的“臨終遺言”。一旦重寫了dealloc方法就必須調用[super dealloc],并且放在代碼塊的最后調用(不能直接調用dealloc方法)。

一旦對象被回收了,那么他所占據的存儲空間就不再可用,堅持使用會導致程序崩潰(野指針錯誤)。

 

2、相關概念和使用注意

野指針錯誤:訪問了一塊壞的內存(已經被回收的,不可用的內存)。

僵尸對象:所占內存已經被回收的對象,僵尸對象不能再被使用。(打開僵尸對象檢測)

簡單講解Objective-C的基本特性及其內存管理方式

空指針:沒有指向任何東西的指針(存儲的東西是0,null,nil),給空指針發送消息不會報錯

注意:不能使用[p retaion]讓僵尸對象起死復生。

 

3、內存管理原則

(1)原則

只要還有人在使用某個對象,那么這個對象就不會被回收;

只要你想使用這個對象,那么就應該讓這個對象的引用計數器+1;

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

(2)誰創建,誰release

(a)如果你通過alloc,new,copy來創建了一個對象,那么你就必須調用release或者autorelease方法

(b)不是你創建的就不用你去負責

(3)誰retain,誰release

只要你調用了retain,無論這個對象時如何生成的,你都要調用release

(4)總結

有始有終,有加就應該有減。曾經讓某個對象計數器加1,就應該讓其在最后-1.

 

4、內存管理代碼規范

(1)只要調用了alloc,就必須有release(autorelease)

(2)set方法的代碼規范

(a)基本數據類型:直接復制

復制代碼 代碼如下:


-(void)setage:(int)age

 

{

_age=age;

}


(b)oc對象類型

復制代碼 代碼如下:


-(void)setcar:(car *)car

 

{

//1.先判斷是不是新傳進來的對象

if(car!=_car)

{

//2 對舊對象做一次release

[_car release];//若沒有舊對象,則沒有影響

//3.對新對象做一次retain

_car=[car retain];

}

}

(3)dealloc方法的代碼規范

(a)一定要[super dealloc],而且要放到最后

(b)對self(當前)所擁有的的其他對象做一次release操作

-(void)dealloc

{

[_car release];

[super dealloc];

}

 


5、@property的參數

(1)內存管理相關參數

retain:對對象release舊值,retain新值(適用于oc對象類型)

assign:直接賦值(默認,適用于非oc對象類型)

copy:release舊值,copy新值

 

(2)是否要生成set方法(若為只讀屬性,則不生成)

readonly:只讀,只會生成getter的聲明和實現

readwrite:默認的,同時生成setter和getter的聲明和實現

 

(3)多線程管理(蘋果在一定程度上屏蔽了多線程操作)

nonatomic:高性能,一般使用這個

atomic:低性能

 

(4)set和get方法的名稱

修改set和get方法的名稱,主要用于布爾類型。因為返回布爾類型的方法名一般以is開頭,修改名稱一般用在布爾類型中的getter。

復制代碼 代碼如下:


@propery(setter=setabc,getter=isrich) bool rich;

 

bool b=p.isrich;// 調用


 

 

6、內存管理中的循環引用問題以及解決

案例:每個人有一張身份證,每張身份證對應一個人,不能使用#import的方式相互包含,這就形成了循環引用。

新的關鍵字:@class 類名;——解決循環引用問題,提高性能

@class僅僅告訴編譯器,在進行編譯的時候把后面的名字作為一個類來處理。

(1)@class的作用:聲明一個類,告訴編譯器某個名稱是一個類

(2)開發中引用一個類的規范

(a)在.h文件中使用@class來聲明類

(b)在.m文件中真正要使用到的時候,使用#import來包含類中的所有東西

(3)兩端循環引用的解決方法

一端使用retain,一端使用assign(使用assign的在dealloc中也不用再release)

 

7、autorelease

(1)基本用法

(1)會將對象放到一個自動釋放池中

(2)當自動釋放池被銷毀時,會對池子里的所有對象做一次release

(3)會返回對象本身

(4)調用完autorelease方法后,對象的計數器不受影響(銷毀時影響)

(2)好處

(1)不需要再關心對象釋放的時間

(2)不需要再關心什么時候調用release

(3)使用注意

(a)占用內存較大的對象,不要隨便使用autorelease,應該使用release來精確控制

(b)占用內存較小的對象使用autorelease,沒有太大的影響

(4)錯誤寫法

(a)連續調用多次autorelease,釋放池銷毀時執行兩次release(-1嗎?)

(b)alloc之后調用了autorelease,之后又調用了release。

(5)自動釋放池

(a)在ios程序運行過程中,會創建無數個池子,這些池子都是以棧結構(先進后出)存在的。

(b)當一個對象調用autorelease時,會將這個對象放到位于棧頂的釋放池中

(6)自動釋放池的創建方式

(a)ios 5.0以前的創建方式

復制代碼 代碼如下:


nsautoreleasepool *pool=[[nsautoreleasepool alloc] init];

 

`````````````````

[pool  release];//[pool drain];用于mac


(b)ios5.0以后

復制代碼 代碼如下:


@autoreleasepool

 

{//開始代表創建自動釋放池

·······

}//結束代表銷毀自動釋放池


(7)autorelease注意

 

(a)系統自帶的方法中,如果不包含alloc new copy等,則這些方法返回的對象都是autorelease的,如[nsdate  date];

(b)開發中經常會寫一些類方法來快速創建一個autorelease對象,創建對象時不要直接使用類名,而是使用self

 

8、arc內存管理機制

(1)arc的判斷準則:

只要沒有強指針指向對象,對象就會被釋放。

(2)指針分類:

(a)強指針:默認的情況下,所有的指針都是強指針,關鍵字strong

(b)弱指針:_ _weak關鍵字修飾的指針

聲明一個弱指針如下:

復制代碼 代碼如下:

_ _weak person *p;


arc中,只要弱指針指向的對象不在了,就直接把弱指針做清空操作。

復制代碼 代碼如下:

_ _weak person *p=[[person alloc]  init];//不合理,對象一創建出來就被釋放掉,對象釋放掉后,arc把指針自動清零。


arc中在property處不再使用retain,而是使用strong,在dealloc中不需要再[super dealloc]。

 

@property(nonatomic,strong)dog *dog;// 意味著生成的成員變量_dog是一個強指針,相當于以前的retain。

如果換成是弱指針,則換成weak,不需要加_ _。

 

(3)arc的特點總結:

(a)不允許調用release,retain,retaincount

(b)不允許重寫dealloc,但是不允許調用[super dealloc]

(c)@property的參數:

strong:相當于原來的retain(適用于oc對象類型),成員變量是強指針

weak:相當于原來的assign,(適用于oc對象類型),成員變量是弱指針

assign:適用于非oc對象類型(基礎類型)

(4)補充

讓程序兼容arc和非arc部分。轉變為非arc  -fno-objc-arc  轉變為arc的, -f-objc-arc 。

arc也需要考慮循環引用問題:一端使用retain,另一端使用assign。

簡單講解Objective-C的基本特性及其內存管理方式

提示:字符串是特殊的對象,但不需要使用release手動釋放,這種字符串對象默認就是autorelease的,不用額外的去管內存。

延伸 · 閱讀

精彩推薦
  • IOSiOS開發之視圖切換

    iOS開發之視圖切換

    在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,今天我們將...

    執著丶執念5272021-01-16
  • IOSiOS中MD5加密算法的介紹和使用

    iOS中MD5加密算法的介紹和使用

    MD5加密是最常用的加密方法之一,是從一段字符串中通過相應特征生成一段32位的數字字母混合碼。對輸入信息生成唯一的128位散列值(32個字符)。這篇文...

    LYSNote5432021-02-04
  • IOSiOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    這篇文章主要介紹了iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果的相關資料,需要的朋友可以參考下...

    jiangamh8882021-01-11
  • IOS詳解iOS中多個網絡請求的同步問題總結

    詳解iOS中多個網絡請求的同步問題總結

    這篇文章主要介紹了詳解iOS中多個網絡請求的同步問題總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    liang199111302021-03-15
  • IOSiOS中UILabel實現長按復制功能實例代碼

    iOS中UILabel實現長按復制功能實例代碼

    在iOS開發過程中,有時候會用到UILabel展示的內容,那么就設計到點擊UILabel復制它上面展示的內容的功能,也就是Label長按復制功能,下面這篇文章主要給大...

    devilx12792021-04-02
  • IOSiOS開發技巧之狀態欄字體顏色的設置方法

    iOS開發技巧之狀態欄字體顏色的設置方法

    有時候我們需要根據不同的背景修改狀態欄字體的顏色,下面這篇文章主要給大家介紹了關于iOS開發技巧之狀態欄字體顏色的設置方法,文中通過示例代碼...

    夢想家-mxj8922021-05-10
  • IOSiOS實現控制屏幕常亮不變暗的方法示例

    iOS實現控制屏幕常亮不變暗的方法示例

    最近在工作中遇到了要將iOS屏幕保持常亮的需求,所以下面這篇文章主要給大家介紹了關于利用iOS如何實現控制屏幕常亮不變暗的方法,文中給出了詳細的...

    隨風13332021-04-02
  • IOSiOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和

    這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關資料,需要的朋友可以參考下...

    CodingFire13652021-02-26
主站蜘蛛池模板: 手机在线免费观看日本推理片 | 石原莉奈adn093店长未婚妻 | 国产精品日本一区二区三区在线看 | 我的奶头被客人吸的又肿又红 | 欧美成人免费草草影院视频 | xnxx老师| 男人天堂bt | 国产精品资源在线观看 | 免费人成在线观看视频播放 | 和日本免费不卡在线v | 亚洲AV久久久久久久无码 | 国内视频一区二区 | 三级伦理在线播放 | 亚洲va久久久噜噜噜久久狠狠 | 国产综合久久久久 | 国产啪精品视频网给免丝袜 | 国产精品久久国产精品99 gif | 91亚洲专区 | 亚洲 欧美 国产 综合首页 | chinesemature老女人 | 猛h辣h高h文湿重口 门房秦大爷在线阅读 | 调教禽兽| 欧美午夜性春猛交bbb | 四虎影视在线观看永久地址 | 久久久久青草大香线综合精品 | 午夜一区二区福利视频在线 | 国产自产一区c | 亚洲欧美日韩中文高清一 | 国产三级精品91三级在专区 | 黑人巨荃大战乌克兰美女 | 欧美成人aaaa免费高清 | 青青草原在线免费 | 五月桃花网婷婷亚洲综合 | 成人榴莲视频 | 成人福利在线 | 99看视频 | 色99视频| 蜜桃在线 | 欧美多gayxxxx| 午夜欧美精品久久久久久久 | 亚洲视频免费在线看 |