OC語言瘋狂講義學習筆記

1蒸其、關于nil和Nil及NULL的區(qū)別:

nil: A null pointer to an Objective-C object. ( #define nil ((id)0) ) nil 是一個對象值。
Nil: A null pointer to an Objective-C class.
NULL: A null pointer to anything else. ( #define NULL ((void *)0) ) NULL是一個通用指針(泛型指針)镣奋。
NSNull: A class defines a singleton object used to represent null values in collection objects (which don't allow nil values).
[NSNull null]: The singleton instance of NSNull.
[NSNull null]是一個對象,他用在不能使用nil的場合。

2、避免使用僵尸對象的方法

為了防止不小心調(diào)用了僵尸對象,可以將對象賦值nil(對象的空值)


僵尸對象.png

3岭埠、對象的內(nèi)存泄露

內(nèi)存泄露1.png

內(nèi)存泄露1.png

內(nèi)存泄露2.png

內(nèi)存泄露3_1.png

內(nèi)存泄露3_2.png

4裹刮、@property 參數(shù)

property參數(shù).png

內(nèi)存管理相關參數(shù):


內(nèi)存管理相關參數(shù).png

assign.png

assign_2.png

retain_1.png

retain_2.png

retain_3.png

retain_3.png

retain_4.png

proPerty參數(shù)二.png

property_set.png

property_get.png

5音榜、@class的使用

作用

可以簡單地引用一個類

簡單使用

@class Dog; //類的引入
僅僅是告訴編譯器: Dog是一個類; 并不會包含Dog這個類的所有內(nèi)容

具體使用

在.h文件中使用@class引用一個類 在.m文件中使用#import包含這個類的.h文件

通常引用一個類有兩種辦法:
一種是通過#import方式引入;另一種是通過@class引入; 這兩種的方式的區(qū)別在于:

1)#import方式會包含被引用類的所有信息,包括被引用類的變量和方法;@class方式只是告訴 編譯器在A.h文件中 B *b 只是類的聲明,具體這個類里有什么信息,這里不需要知道,等實現(xiàn)文 件中真正要用到時,才會真正去查看B類中信息;

2)使用@class方式由于只需要只要被引用類(B類)的名稱就可以了,而在實現(xiàn)類由于要用到被 引用類中的實體變量和方法,所以需要使用#import來包含被引用類的頭文件;

3)通過上面2點也很容易知道在編譯效率上,如果有上百個頭文件都#import了同一 個文件,或 者這些文件依次被#improt(A->B, B->C,C->D...),一旦最開始的頭文件稍有改動,后面引用到這 個文件的所有類都需要重新編譯一遍,這樣的效率也是可想而知的,而相對來 講,使用@class方 式就不會出現(xiàn)這種問題了;

所以:我們實際開發(fā)中盡量在.h頭文件中使用@class

4)對于循環(huán)依賴關系來說,比方A類引用B類,同時B類也引用A類,B類的代碼:

recycle.png

作用上的區(qū)別

import會包含引用類的所有信息(內(nèi)容), 包括引用類的變量和方法 @class僅僅是告訴編譯器有這么一個類, 具體這個類里有什么信息, 完全不知

效率上的區(qū)別

如果有上百個頭文件都#import了同一個文件,或者這些文件依次被#import,那么一旦最開始的頭 文件稍有改動,后面引用到這個文件的所有類都需要重新編譯一遍 , 編譯效率非常低 相對來講,使用@class方式就不會出現(xiàn)這種問題了

6、循環(huán)引用

循環(huán)retain的場景

recycle.png

比如A對象retain了B對象,B對象retain了A對象 循環(huán)retain的弊端 這樣會導致A對象和B對象永遠無法釋放

循環(huán)retain的解決方案

當兩端互相引用時,應該一端用retain捧弃、一端用assign

7赠叼、NSString 類的內(nèi)存管理問題

1)、NSString 等Foundation框架中類的內(nèi)存管理

內(nèi)存管理.png

先看看以下這幾種寫法:

NSString *testStr1 = @"a";
NSString *testStr2 = [NSString stringWithString:@"a"];
NSString *testStr3 = [NSString stringWithFormat:@"b"];
NSString *testStr4 = [[NSString alloc] initWithString:@"c"];
NSString *testStr5 = [[NSString alloc] initWithFormat:@"d"];
NSString *testStr6 = [[NSString alloc] init];

NSLog(@"testStr1 ->%p",testStr1);
NSLog(@"testStr2 ->%p",testStr2);
NSLog(@"testStr3 ->%p",testStr3);
NSLog(@"testStr4 ->%p",testStr4);
NSLog(@"testStr5 ->%p",testStr5);
NSLog(@"testStr6 ->%p",testStr6);

內(nèi)存管理_2.png

通過對比地址可以看到,從上可以看出,testStr1,testStr2,testStr4都是在一個內(nèi)存區(qū)域,也 就是常量內(nèi)存區(qū),

1---> NSString *str = [[NSString alloc] initWithString:@"ABC"]; 
2---> str = @"123";
3---> [str release];
4---> NSLog(@"%@",str);

首先,咱們先對這段代碼進行分析违霞。
第一句 聲明了一個NSString類型的實例 str, 并將其初始化init后賦值為@"ABC" 第二行,將str的指針指向了一個常量@"123"嘴办。 理論上講在第一行初始化的@"ABC"沒有任何任何 指針指向了。 所以造成了內(nèi)存泄露
然后第三行, 將str的引用計數(shù)-1
第四行輸出str的值 為123.
首先回答為什么不會崩潰, 因為第三行的release 實際上是release了一個常量@"123" 而作為 常量,其默認的引用計數(shù)值是很大的(100k+)
NSLog(@"retainCount = %tu",[@"123" retainCount]);
最終的輸出值會是一個很大很大的數(shù)买鸽。 所以單單一個release是不會將其釋放掉的户辞。
然后再回答這樣會不會造成內(nèi)存泄露。
其實............理論上講 會!
但是實際上,Objective-C對NSString類型有特殊照顧癞谒。所有的NSString的引用計數(shù)器默認初始值 都會非常非常大底燎。

2)、危險的用法

while ([a retainCount] > 0) {
         [a release];
} 

如果運行結果正確,那么這是多么幸運的一個人啊!

8弹砚、自動釋放池及autorelease介紹

自動釋放池

(1)在iOS程序運行過程中,會創(chuàng)建無數(shù)個池子,這些池子都是以棧結構(先進后出)存在的双仍。 (2)當一個對象調(diào)用autorelease時,會將這個對象放到位于棧頂?shù)尼尫懦刂?/p>

自動釋放池的創(chuàng)建方式

(1)iOS 5.0以前的創(chuàng)建方式

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

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


(2)iOS5.0以后 

@autoreleasepool
{//開始代表創(chuàng)建自動釋放池
·······
}//結束代表銷毀自動釋放池

####  autorelease

是一種支持引用計數(shù)的內(nèi)存管理方式 
它可以暫時的保存某個對象(object),然后在內(nèi)存池自己的排干(drain)的時候對其中的每個 對象發(fā)送release消息 注意,這里只是發(fā)送release消息,如果當時的引用計數(shù)(reference-counted)依然不為0,則該 對象依然不會被釋放∽莱裕可以用該方法來保存某個對象,也要注意保存之后要釋放該對象朱沃。

####  為什么會有autorelease?
(1)不需要再關心對象釋放的時間 
(2)不需要再關心什么時候調(diào)用release

####  autorelease何時釋放?
對于autorelease pool本身,會在如下兩個條件發(fā)生時候被釋放
1)手動釋放Autorelease pool
2)Runloop結束后自動釋放
對于autorelease pool內(nèi)部的對象
在引用計數(shù)的retain == 0的時候釋放。release和autorelease pool 的 drain都會觸發(fā)retain-- 事件。

### 9逗物、Block
一搬卒、靜態(tài)變量和全局變量 在加和不加 __block都會直接引用變量地址。也就意味著可以修
改變量的值翎卓。在沒有加__block 參數(shù)的情況下契邀。
? 全局block和棧block區(qū)別為是否引用了外部變量,堆block則是對棧block copy得來。對全局block
copy 不會有任何作用,返回的依然是全局block失暴。
二, 常量變量(NSString *a = @"hello";a 為常量變量,@“hello”為常量坯门。)-----不 加__block類型 block 會引用常量的地址(淺拷貝)。加__block類型 block會去引用常量變 量(如:a變量,a = @"abc".可以任意修改a 指向的內(nèi)容逗扒。)的地址古戴。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市矩肩,隨后出現(xiàn)的幾起案子现恼,更是在濱河造成了極大的恐慌,老刑警劉巖黍檩,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件述暂,死亡現(xiàn)場離奇詭異,居然都是意外死亡建炫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門疼蛾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肛跌,“玉大人,你說我怎么就攤上這事察郁⊙苌鳎” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵皮钠,是天一觀的道長稳捆。 經(jīng)常有香客問我,道長麦轰,這世上最難降的妖魔是什么乔夯? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮款侵,結果婚禮上末荐,老公的妹妹穿的比我還像新娘。我一直安慰自己新锈,他們只是感情好甲脏,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般块请。 火紅的嫁衣襯著肌膚如雪娜氏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天墩新,我揣著相機與錄音贸弥,去河邊找鬼。 笑死抖棘,一個胖子當著我的面吹牛茂腥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播切省,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼最岗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了朝捆?” 一聲冷哼從身側響起般渡,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芙盘,沒想到半個月后驯用,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡儒老,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年蝴乔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驮樊。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡薇正,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出囚衔,到底是詐尸還是另有隱情挖腰,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布练湿,位于F島的核電站猴仑,受9級特大地震影響,放射性物質發(fā)生泄漏肥哎。R本人自食惡果不足惜辽俗,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望篡诽。 院中可真熱鬧榆苞,春花似錦、人聲如沸霞捡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赊琳,卻和暖如春街夭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躏筏。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工板丽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人趁尼。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓埃碱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親酥泞。 傳聞我的和親對象是個殘疾皇子砚殿,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 轉至元數(shù)據(jù)結尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,686評論 0 9
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理芝囤,服務發(fā)現(xiàn)似炎,斷路器,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • 1.OC里用到集合類是什么悯姊? 基本類型為:NSArray羡藐,NSSet以及NSDictionary 可變類型為:NS...
    輕皺眉頭淺憂思閱讀 1,366評論 0 3
  • 307、setValue:forKey和setObject:forKey的區(qū)別是什么悯许? 答:1, setObjec...
    AlanGe閱讀 1,532評論 0 1
  • 1. Java基礎部分 基礎部分的順序:基本語法仆嗦,類相關的語法,內(nèi)部類的語法先壕,繼承相關的語法瘩扼,異常的語法,線程的語...
    子非魚_t_閱讀 31,598評論 18 399