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高级编程 笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 场景/故事/story——寻物者发布消息
- 下一篇: 【Linux】scp“免密” 远程cop