日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

objective-c高级编程 笔记

發布時間:2024/6/21 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 objective-c高级编程 笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引用計數:通過給對象計數標志,來判斷是否釋放對象

注:只能釋放自己持有的對象

id obj = [NSMutableArray array]

如obj這個對象,并不是你所持有的對象,所以你無法進行釋放

但是你可以通過retain來持有這個對象

[obj retain] [obj release]

什么樣的對象不是你所持有的,比如你調用了

[obj autorelease]

使用autorelease會讓你的對象注冊到autoreleasepool中,在pool結束時,自動調用release

現在說說計數

通過alloc或者retain,都能讓這個對象的引用計數加一

調用release后,引用計數減一

每次調用release,都會對引用計數進行判斷,若減一后引用計數為0

則會調用dealloc廢棄對象

[self dealloc]

在ios中,蘋果通過散列表(哈希表)管理引用計數

autorelease的使用

//未使用ARC NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; id obj = [[NSObject alloc] init]; [obj autorelease]; [pool drain];//使用ARC @autoreleasepool {id __autoreleasing obj = [[NSObject alloc] init]; }

?


__strong

表示對對象的強引用

{id __strong obj = [[NSObject alloc] init];//等同于 id obj = [[NSObject alloc] init];//obj為強引用,自己持有對象 }//obj超出其作用域,強引用失效,自動釋放自己持有的對象,對象的所有者不在,廢棄該對象

在強引用中,可能造成互相強引用和對自身的強引用,造成內存的泄露

//這里寫個對自身的強引用 {id test = [[Test alloc] init];//Test 為自己定義的一個類 [test setObejct:test];//setObejct 是Test中的一個方法,給屬性obj(id __strong obj)賦值 }//超出作用域,test被釋放//但test里的屬性obj被賦值為test,test被釋放,里面的屬性也要被釋放因此test被再次釋放,因此發生了內存的泄露

這時就需要弱引用

__weak

表示對對象的弱引用,弱引用不能持有對象的實例

id __weak obj = [[NSObject alloc] init]; //這類在編譯器中都會報錯,因為弱引用無法持有對象,生成的對象會立即被釋放,也就是對象的引用計數并未增加,還是0 id __strong obj1 = [[NSObject alloc] init]; id __weak obj2 = obj1; //這個就沒問題了,對象被obj1引用,并沒有立即釋放

所以剛剛的問題,只要將剛剛的Test類的屬性設為id __weak obj就行了

ARC的規則

第一、不能使用retain/release/retainCount/autorelease
使用ARC,內存管理由編譯器來負責,無需寫上面關鍵詞
第二、在ARC環境下,使用alloc/new/copy/mutableCopy來生成/持有對象
copy/mutableCopy的使用需要copyWithZone的支持,如果沒有,則不支持copy/mutableCopy
第三、不能顯示調用 dealloc
第四、使用@autoreleasepool塊來替代NSAutorealeasePool
第五、不能使用區域NSZone
第六、對象變量不能作為C語言結構體的成員
第七、顯示轉換id和void *
第七、不能使用NSAllocateObject/NSDeallocateObject

關于顯示轉為id和void *,要知道core foundation h和bridge方面的知識

參考博客http://blog.csdn.net/annkey123/article/details/8271867

也就是core foundation其實是用c寫的,提供底層的接口,為什么需要它呢,因為這樣可以讓各種不同的框架聯系起來

這里有個關于這方面的歷史http://www.udpwork.com/item/10889.html

id obj; 等于 id __strong obk;

id *obj; 等于 id __autoreleasing *obj;

所以在聲明一個強引用的數組時,需要這樣定義 id __strong *array


保留。。。。。一臉懵逼


多線程:http://www.jianshu.com/p/2d57c72016c6

還有個信號量:http://www.jianshu.com/p/c5a4a3fce93d

?

轉載于:https://www.cnblogs.com/dj3839/p/6798820.html

總結

以上是生活随笔為你收集整理的objective-c高级编程 笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。