1. 程式人生 > >iOS中程式碼建立UIView的時候,使用weak還是strong?

iOS中程式碼建立UIView的時候,使用weak還是strong?

我們知道,從 Storyboard 往編譯器拖出來的 UI 控制元件的屬性是 weak 的,那麼程式碼建立uiview的時候呢?

我認為 UI 控制元件用預設用 weak,根源還是蘋果希望只有這些 UI 控制元件的父 View 來強引用它們,而 ViewController 只需要強引用 ViewController.view 成員,則可以間接持有所有的 UI 控制元件。這樣有一個好處是:在以前,當系統收到 Memory Warning 時,會觸發 ViewController 的 viewDidUnload 方法,這樣的弱引用方式,可以讓整個 view 整體都得到釋放,也更方便重建時整體重新構造。


但是首先 viewDidUnload 方法在 iOS 6 開始就被廢棄掉了,蘋果用了更簡單有效地方式來解決記憶體警告時的檢視資源釋放,具體如何做的呢?嗯,這個可以當作某一期的面試題展開介紹。總之就是,除非你特殊地操作 view 成員,ViewController.view 的生命期和 ViewController 是一樣的了。




所以在這種情況下,其實 UI 控制元件是不是 weak 其實關係並不大。當 UI 控制元件是 weak 時,它的引用計數是 1,持有它的是它的 superview,當 UI 控制元件是 strong 時,它的引用計數是 2,持有它的有兩個地方,一個是它的 superview,另一個是這個 strong 的指標。UI 控制元件並不會持有別的物件,所以,不管是手寫程式碼還是 Storyboard,UI 控制元件是 strong 都不會有迴圈引用的。


那麼回到我們的最初的問題,自己寫的 view 成員,應該用 weak 還是 strong?我個人覺得應該用 strong,因為用 weak 並沒有什麼特別的優勢,加上上一篇面試題文章中,我們還看到,其實 weak 變數會有額外的系統維護開銷的,如果你沒有使用它的特別的理由,那麼用 strong 的話應該更好。


另外有讀者也提到,如果你要做 Lazy 載入,那麼你也只能選擇用 strong。


當然,如果你非要用 weak,其實也沒什麼問題,只需要注意在賦值前,先把這個物件用 addSubView 加到父 view 上,否則可能剛剛建立完,它就被釋放了。

相關推薦

iOS程式碼建立UIView的時候使用weak還是strong

我們知道,從 Storyboard 往編譯器拖出來的 UI 控制元件的屬性是 weak 的,那麼程式碼建立uiview的時候呢? 我認為 UI 控制元件用預設用 weak,根源還是蘋果希望只有這些 UI 控制元件的父 View 來強引用它們,而 ViewControlle

關於MyEclipseweb建立在web-inf沒有發現web.xml檔案

第一種解決方案: 如果你認為自己勤勞的話,可以手動新增。嘿嘿。 第二種解決方案: 右鍵自己建立的pro(web專案) 在選項卡中選擇java ee tools 將Generate web.xml deployment descriptor 選上  

webapp在ios簡單實現滑動回彈加速等效果

-webkit-overflow-scrolling來自safari原生控制元件的實現,工作原理是:在有這個屬性的容器上,系統會建立了一個uiscrollview,應用於該元素並將之作為渲染物件,從而為我們實現體驗流暢的觸屏滑動 在Ios上的表現結果令人十分滿意,並且網

在jQuery動態建立id如何使用該Id來訪問這個元素

1、如我們在我一個for迴圈中動態的建立了一個元素<ul>,<ul>元素裡面的li動態的給了一個id如下 for(var i = 0 ; i <  k ; k ++){ $(".someOne").append("<ul><l

SharePoint 2013 程式碼建立列表查閱項欄位

  1、首先,開啟VS建立兩個List Definition,分別是Address和City,如下圖:   2、City列表裡修改Title為City Name,其實內部名稱還是Title,注意一下:   3、給City的列表例項,新增幾個值,用來測試使用,如下:  

iOS 的巨集定義常量與列舉型別使用

開發過程中的經常需要使用一些全域性的常量,便於方法之間的引數傳遞和型別確定等,經常使用到的有巨集定義,const常量以及列舉等,我們經常使用巨集定義來進行全域性常量的定義,但是是不是所有的全域性常量巨

iOSdelegate代理物件使用weak和assign哪個

       之前不停應用的是assign,本日除錯一段程式碼的時間,發明順序會crash失落,報錯EXC_BAD_ACCESS 經由一番研討,發明若是應用 @property (nonatomic,

IOS圖片拉伸類似Android的點9圖片

其中capInsets這個引數的格式是(top,left,bottom,right),從上、左、下、右分別在圖片上畫了一道線,這樣就給一個圖片加了一個框。只有在框裡面的部分才會被拉伸,而框外面的部分則不會改變。 (adsbygoogle = window.adsbygoogle ||

webView 之 webapp在ios簡單實現滑動回彈加速等效果

webkit-overflow-scrolling來自safari原生控制元件的實現,工作原理是:在有這個屬性的容器上,系統會建立了一個uiscrollview,應用於該元素並將之作為渲染物件,從而為我們實現體驗流暢的觸屏滑動 在Ios上的表現結果令人十分滿意,並且網頁

VB程式碼建立資料庫

Private Sub Command1_Click()  Dim wrkDefault As Workspace  Dim dbsNew As Database  Dim tdfNew As TableDef  Dim NewDB As Database   If Dir("D:/NewDB.mdb")

IOS屬性的關鍵修飾詞:strong weak assign copy retain等。。

@property與@synthesize是成對出現的,可以自動生成某個類成員變數的存取方法。在Xcode4.5以及以後的版本,@synthesize可以省略。1.atomic與nonatomicatomic:預設是有該屬性的,這個屬性是為了保證程式在多執行緒情況,編譯器會自動生成一些互斥加鎖程式碼,避免該變

Oracle如何建立約束查詢約束和刪除約束(check約束外來鍵和主鍵約束)

Oracle  建立主鍵,外來鍵, check約束的幾種方法:(write by RFH) 1. 在建立表時建立約束: //新增主鍵約束 Create table userinfo (userid number(20)constraint  pk_user  primary

IOSurl的編碼解碼問題

//IOS最簡單的url編碼  NSString *stringEncode = [stringEncode stringByAddingPercentEscapesUsingEncoding:N

計算機網路這些高頻考題在死記硬背嗎?(一)

#### 原文連結:[原文來自個人公眾號—C you again](https://mp.weixin.qq.com/s/A_OM3jqP_YlMYfGeQ5JuKw) > 對於IT從業者來說,計算機網路是一門必修課,也是一塊硬骨頭,不論是你是在工作中還是面試時,都需要掌握一些網路技術。從本期開始,小

IOS 在storyboard建立按鈕程式碼控制按鈕

1.在工程中找到Main.storyboard檔案。 2.在Xcode右下角點選一個圓形的table標籤,並找到Button控制元件。 3.點選Xcode右上角,有個雙圓環的按鈕。 4.按住ctrl建,並用滑鼠左鍵點選按鈕,拖向ViewController.h檔案中,

iOS 在xib或者storyboard新增AutoLayout後程式碼修改AutoLayout約束條件

如果是viewControl則AutoLayout適配寫在- (void)updateViewConstraints方法中修改約束; 如果是view則AutoLayout適配 則在- (void

IOS時間選擇器UIPickerViewios8UIView替代UIActionSheet

以前在網上下了個時間選擇器Demo,由於封裝成UIActionSheet型別,而ios8棄用了UIActionSheet和UIAlertView,不得不對程式碼進行修改。將封裝的UIActionSheet改為UIView,為了多型初始化時添加了列舉(幾個時間選擇器樣式)。

JAVA使用程式碼建立多資料來源並實現動態切換(一)

摘要: 案例基於Spring+mybatis。 設計的目的:解決不確定(個數和種類)資料來源的切換問題 2017-06-06 11:31:57補充:近日,在本文的基礎之上,擴充套件了下,使用atomikos來管理事務,保證多資料來源操作時,事務一致性。(htt

ioslayer動畫和UIView動畫程式碼總結

#pragma mark layer動畫 - (IBAction)pressClick2:(id)sender {     UIButton *button = (UIButton *)sender;     NSInteger tag = button.tag;          CATransition

ios建立可以拖動的view原理和實現詳解(含程式碼)

有時候我們會需要在介面上拖動view;uiview是繼承於uiresponder的,所以可以響應觸控相關的事件。 重點是以下一組方法: - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  -