iOS-多線程Day01

來源:互聯網
上載者:User

標籤:時間   ack   表示   合成   自動   priority   stack   getter   特點   

# 棧區/堆區/常量區
- 操作記憶體的棧區速度很快;棧區儲存空間地址是連續的
- 操作記憶體的常量區速度很快;記憶體空間只開闢一次;
- 操作記憶體的堆區速度相對棧區和常量區要慢些;堆區記憶體空間不連續,需要定址
`` // 儲存在棧區` int num = 10;`
// 儲存在常量區 ` NSString *str1 = @"hello";`
// 儲存在堆區`NSString *str2 = [NSString stringWithFormat:@"hello_%d",i];`
``

#建立線程的三種方式
- `NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(demo:) object:@"alloc"];`
- `[NSThread detachNewThreadSelector:@selector(demo:) toTarget:self withObject:@"detach"];`
- ` [self performSelectorInBackground:@selector(demo:) withObject:@"perform"];`

#target和selector的關係
- 執行哪個對象上的哪個方法.

#@synthesize是啥?什麼情況下使用?
- 首先一旦重寫來屬性的setter和getter方法後,系統不再自動產生帶底線的成員變數,而這行代碼會創造一個帶底線首碼的執行個體變數名,同時使用這個屬性產生getter 和 setter 方法。
- 使用`@synthesize` 只有一個目的——給執行個體變數起個別名,或者說為同一個變數添加兩個名字。
- 如果要阻止自動合成,記得使用 `@dynamic` 。經典的使用情境是你知道已經在某處實現了getter/setter 方法,而編譯器不知道的情況。
- 如何使用: `@synthesize obj2 = _obj2;`

#線程的狀態-生命週期
- start :就緒狀態,等待被CPU調用,當被調用的時候為運行狀態
- sleep/加鎖:阻塞狀態
- exit:完全殺死(非正常死亡),*不要在主線程中調用*

#線程屬性(name,stackSize,isMainThread,threadPriority,qualityOfService)
- `name` - 線程名稱
- 設定線程名稱可以當線程執行的方法內部出現異常時,記錄異常和當前線程
- `stackSize` - 棧區大小
- 預設情況下,無論是主線程還是子線程,棧區大小都是 512K
- 棧區大小可以設定 `[NSThread currentThread].stackSize = 1024 * 1024;`
- 必須是 4KB 的倍數
- `isMainThread` - 是否主線程
- `threadPriority` - 線程優先順序
- 優先順序,是一個浮點數,取值範圍從`0~1.0`
- `1.0`表示優先順序最高
- `0.0`表示優先順序最低
- 預設優先順序是 `0.5`
- **優先順序高只是保證 CPU 調度的可能性會高**
- `qualityOfService` - 服務品質(iOS 8.0 推出)
- NSQualityOfServiceUserInteractive - 使用者互動,例如繪圖或者處理使用者事件
- NSQualityOfServiceUserInitiated - 使用者需要
- NSQualityOfServiceUtility - 工具 + 生產力,使用者不需要立即得到結果
- NSQualityOfServiceBackground - 後台
- NSQualityOfServiceDefault - 預設,介於使用者需要和工具 + 生產力之間

#NSUInteger和NSInteger的區別

- `NSInteger `有符號整數(有正負數)用 `%zd`
- `NSUInteger` 不帶正負號的整數(沒有負數)用 `%tu`
- 是為了自適應32位和64位CPU的架構.

#安全執行緒-資源共用(互斥鎖小結)
- `@ synchronized`互斥鎖,使用了線程同步技術
- 同步鎖/互斥鎖:可以保證被鎖定的代碼,同一時間,只能有一個縣城可以操作
- `self`:鎖對象,任何繼承自NSObject的對象都可以是鎖對象,因為內部都有一把鎖,而且是預設開著的
- 鎖對象:一定要是全域的鎖對象,要保證所有的線程都能訪問,self是最方便使用的鎖對象
- 互斥鎖鎖定你的範圍應該盡量小,但是一定要鎖住資源的讀寫部分
- 枷鎖後程式的執行效率比不加鎖的時候要低,因為線程要的等待解鎖
- 犧牲了效能保證了安全

#原子屬性和非原子屬性-以及自旋鎖
- `nonatomic` : 非原子屬性
- `atomic` : 原子屬性
- 安全執行緒的,針對多線程設計的屬性修飾符,是預設值.
- 特點 : 單寫多讀
- 單寫多讀 : 保證同一時間,只有一個線程能夠執行setter方法,但是可以有多個線程執行getter方法.
- atomic 屬性的setter裡面裡面有一把鎖,叫做自旋鎖.
- 原子屬性的setter方法是安全執行緒的;但是,getter方法不是安全執行緒的.
- `nonatomic`和`atomic`對比:
- `nonatomic `: 非安全執行緒,適合記憶體小的行動裝置.
- `atomic` : 安全執行緒,需要消耗大量的資源.效能比非原子屬性要差一點

#loadView的注意事項
1. 用於載入指定的視圖,一旦重寫了這個方法,Storyboard裡面就不會去載入根視圖了
2. 先於`viewDidLoad`調用
3. 不可以調用`super.loadView()`
4. 當`self.view == nil`時回調用此方法

#ViewController的生命週期

- `loadView`:用於載入制定的根試圖
- ` viewDidLoad`:試圖載入完畢
- `viewWillAppear`:介面即將顯示在螢幕上
- `viewDidAppear`:介面已經完全渲染在螢幕上
- `viewWillDisappear`:介面即將從螢幕上消失
- `viewDidDisappear`:介面已經完全消失
- `dealloc`:控制器銷毀

#什麼時候用`stong`/`weak`
- 根視圖和父視圖需要使用strong; 子視圖使用weak
- 沒有強指標指向的對象使用strong; 有強指標指向的可以可以weak

#線程間通訊(怎麼做到的?為什麼能通訊?)
- 因為多線程共用地址空間和資料空間, 一個線程的資料可以直接提供給其他線程使用,叫做線程間通訊
- `performSelectorInBackground`
- `performSelectorOnMainThread`

iOS-多線程Day01

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.