1. 程式人生 > >讀書筆記:Objective-C高階程式設計 iOS與OS X多執行緒和記憶體管理 ——(持續)

讀書筆記:Objective-C高階程式設計 iOS與OS X多執行緒和記憶體管理 ——(持續)

1.記憶體管理的思考方式:
  • .自己生成的物件,自己所持有
  • .非自己生成的物件,自己也能持有
  • 不再需要自己持有的物件時釋放
  • 非自己持有的物件無法釋放
由NSObject類擔任下面管理職責
eg: 
    /*
     * 取得的物件存在,但是自己不持有
     */
    id obj = [NSMutableArray array];
    /*
     * 自己持有物件
     */
    [obj retain];



2.autrelease    autorelease對待例項相當於c語言裡面的區域性變數,出了區域就被廢棄(如果對自動釋放池進行自動釋放,那麼會出現異常—>理由:無論呼叫哪一個物件的autorelease例項方法,實際上是呼叫NSObject類的autorelease例項方法,但是對於NSAutorelease類,autorelease例項方法已被該類過載,因此執行時會出錯)
使用方法:
  1. 生成並持有NSAutoreleasePool物件
  2. 呼叫已經分配物件的autorelease
  3. 廢棄NSAutoreleasePool物件
autrelease生命週期
  1. 自己設定的釋放池的生命週期:,超出其作用域就會自動廢棄(某一段程式大量生成autorelease物件使用)
  2. 系統的釋放池:程式主迴圈的NSRunLoop或者其他程式可以執行的地方,對釋放池物件進行生成,持有和廢棄,(程式關閉)
3.ARC下的四種修飾符      1.__strong、__weak、__unsafe_unretained、__autoreleasing __strong修飾符是id型別和物件型別預設的所有權修飾符,
__strong、__weak、__autoreleasing修飾符所修飾的自動變數初始化為nil,即:
    id __strong obj0;   
    id __weak obj1;
    id __autoreleasing obj2;
    // 等同於下面程式碼   
    id __strong obj0 = nil;    
    id __weak obj1 = nil;
    id __autoreleasing obj2 = nil;

// 1.__block不管是ARC還是MRC模式下都可以使用,可以修飾物件,還可以修飾基本資料型別。 2.__weak只能在ARC模式下使用,也只能修飾物件(NSString),不能修飾基本資料型別(int)。
3.__block物件可以在block中被重新賦值,__weak不可以。 PS:__unsafe_unretained修飾符可以被視為iOS SDK 4.3以前版本的__weak的替代品,不過不會被自動置空為nil。所以儘可能不要使用這個修飾符。

相關推薦

讀書筆記Objective-C高階程式設計 iOSOS X執行記憶體管理 ——持續

1.記憶體管理的思考方式: .自己生成的物件,自己所持有.非自己生成的物件,自己也能持有不再需要自己持有的物件時釋放非自己持有的物件無法釋放由NSObject類擔任下面管理職責 eg:  /

Objective-C高階程式設計 iOSOS X執行記憶體管理 讀書筆記

1.2.2 記憶體管理原則: 自己生成的物件,自己所持有 非自己生成的物件,自己也能持有 不再需要自己持有的物件時釋放 非自己持有的物件無法釋放 自己生成的物件,自己所持有 //自己生成並持有物件 id obj = [[NSObject alloc] init]; //自己持有物件   

Objective-C高階程式設計:iOSOS X執行記憶體管理

這篇文章主要給大家講解一下GCD的平時不太常用的API,以及文末會貼出GCD定時器的一個小例子。 需要學習的朋友可以通過網盤免費下載pdf版 (先點選普通下載-----再選擇普通使用者就能免費下載了)http://putpan.com/fs/cy1i1beebn7s0h4u9/ 1.G

讀《Objective-C高階程式設計iOSOS X執行記憶體管理

最近一週,公司在廣州有釋出會。去廣州的人很忙,留在公司的開發人員有時也很“忙”。趁著空閒的時間,看了《Objective-C高階程式設計iOS與OS X多執行緒和記憶體管理》這書,網上找的pdf版本。 這本書分三給部分,依次是ARC、Blocks和GCD。 ARC從非

Objective-C 高階程式設計 iOSOS X執行記憶體管理》 核心札記一

蘋果原始碼不會告訴你的 ——引子 近日偶借一本圖靈出版的程式書籍,是由日本資深軟體工程師 K.S. (Twitter:@splhack) 和 TF (Twitter:@munakoiso) 合作編寫,國內 黎華 譯,全書共三章,分別是 ARC,Blocks 和 Grand

Objective-C 高階程式設計 iOSOS X執行記憶體管理》 核心札記二

核心札記二   Blocks   閱讀地點:北京 肯德基店  2014.4.7 1,Blocks 是C 語言的擴充功能,用一句話概述就是:帶有自動變數(區域性變數,作者將此翻譯成自動變數)的匿名函式

block 知識點 ---- Objective-C 高階程式設計 iOS OS X 執行記憶體管理 學習筆記

1. block捕捉變數: 結論:只有呼叫_Block_copy 才能持有截獲的附有 __strong 修飾符的物件型別的自動變數值。 block 中使用物件型別的自動變數時,除以下情形,推薦使用copy方法: “When the Block is returned

ObjectiveC高階程式設計iOSOS X執行記憶體管理讀書筆記

Objective-C高階程式設計:iOS與OS X多執行緒和記憶體管理 自動引用計數 自動引用計數(ARC,Automatic Reference Counting) “在LLVM編輯器中設定ARC為有效狀態,就無需再次鍵入retain或者是releas

Objective-C高階程式設計iOSOS X執行記憶體管理

1. __weak修飾符的優點,除了解決迴圈引用的問題,在持有某物件的弱引用時,若該物件被廢棄,則此弱引用將自動失效並且處於nil被賦值的狀態(空弱引用)。 如: id __wark obj1 = nil; { id _strong obj0 = [[NSObject

[讀書筆記]iOSOS X執行記憶體管理 [GCD部分]

3.2 GCD的API 蘋果對GCD的說明:開發者要做的只是定義想執行的任務並追加到適當的Dispatch Queue中。 “Dispatch Queue”是執行處理的等待佇列。通過dispatch_async函式等API,在Block

Java執行記憶體模型程序執行基礎

Java多執行緒和記憶體模型(一) 由於java是執行在 JVM上 的,所以需要涉及到 JVM 的記憶體模型概念,需要理解記憶體模型,就需要多執行緒的基礎; 而執行緒是基於載體執行緒裡的,所以我們藉由作業系統的程序來講一講。 程序 什麼是程序?

Effective Objective-C 2.0 編寫高質量iOSOS X程式碼的52個有效方法

1. 使用訊息結構的語言,其執行時所應執行的程式碼由執行環境來決定;而使用函式呼叫的語言,則由編譯器來決定。 如果範例程式碼呼叫的函式是多型的,則執行時根據虛擬函式表來查出應該執行哪個函式實現。 而採用訊息結構的語言,不論是否多型,總是在執行時才會去查詢所要執行的方法。 接

C++執行中的future期望

Providers std::promise 和std::future配合使用,給std::future傳遞期望值,下面是最簡單的一個用法: #include <iostream> #include <functional> #include <

Java執行簡單樣例銀行存取錢問題

Bank類 public class Bank { private static int money; public int getMoney(){ return money; } public void saveMon

iOS執行的初步研究-- dispatch佇列

GCD程式設計的核心就是dispatch佇列,dispatch block的執行最終都會放進某個佇列中去進行,它類似NSOperationQueue但更復雜也更強大,並且可以巢狀使用。所以說,結合block實現的GCD,把函式閉包(Closure)的特性發揮得淋漓盡致。 dispatch佇列的生成可以有這

iOS執行的初步研究-- NSThread

對於多執行緒的開發,iOS系統提供了多種不同的介面,先談談iOS多執行緒最基礎方面的使用。產生執行緒的方式姑且分兩類,一類是顯式呼叫,另一類是隱式呼叫。 一、顯示呼叫的類為NSThread。一般構造NSThread的執行緒物件可通過兩種方式: 1. 初始化執行緒主方法: [NSThread detach

iOS執行的初步研究-- dispatch同步

一、dispatch組(dispatch group) 1. 建立dispatch組 dispatch_group_t group = dispatch_group_create();  2. 啟動dispatch佇列中的block關聯到group中 dispatch_group_async(group,

由StreamWriter.WriteLine 引發對C#執行的深入思考

http://blog.csdn.net/nndtdx/article/details/6789810 首先,StreamWriter執行緒安全麼? 答:StreamWriter 的構造以及StreamWriter.WriteLine(string)都是非

iOS執行的初步研究— dispatch源

dispatch源(dispatch source)和RunLoop源概念上有些類似的地方,而且使用起來更簡單。要很好地理解dispatch源,其實把它看成一種特別的生產消費模式。 dispatch源

iOS執行學習之NSOperation

 什麼是NSOperation呢?有什麼用呢?和GCD相比有什麼不同呢?或者優勢呢? NSOperation底層實現是基於GCD的,比GCD多了一些簡單使用的功能,使用更加面向物件 作用:配合使用NSOperation 和 NSOperationQueue也能實現多執行緒