ios學習路線—Objective-C(屬性修飾符)

来源:https://www.cnblogs.com/jiuyi/archive/2018/12/14/10118007.html
-Advertisement-
Play Games

readonly: 此標記說明屬性是只讀的,預設的標記是讀寫,如果你指定了只讀,在@implementation中只需要一個讀取器。或者如果你使用@synthesize關鍵字,也是有讀取器方法被解析。而且如果你試圖使用點操作符為屬性賦值,你將得到一個編譯錯誤。 readwrite: 此標記說明屬性會 ...


readonly: 此標記說明屬性是只讀的,預設的標記是讀寫,如果你指定了只讀,在@implementation中只需要一個讀取器。或者如果你使用@synthesize關鍵字,也是有讀取器方法被解析。而且如果你試圖使用點操作符為屬性賦值,你將得到一個編譯錯誤。

readwrite: 此標記說明屬性會被當成讀寫的,這也是預設屬性。設置器和讀取器都需要在@implementation中實現。如果使用@synthesize關鍵字,讀取器和設置器都會被解析。

nonatomic: 非原子性訪問,對屬性賦值的時候不加鎖,多線程併發訪問會提高性能。如果不加此屬性,則預設是兩個訪問方法都為原子型事務訪問。

atomic 和 nonatomic 用來決定編譯器生成的 getter 和 setter 是否為原子操作。 

 

1.atomic  設置成員變數的 @property 屬性時,預設為 atomic,提供多線程安全。 

在多線程環境下,原子操作是必要的,否則有可能引起錯誤的結果。加了atomic,setter函數會變成下麵這樣:

    {lock}
        if (property != newValue) { 
            [property release]; 
            property = [newValue retain]; 
    }
    {unlock}

 

2.nonatomic  禁止多線程,變數保護,提高性能。 
atomic是Objc使用的一種線程保護技術,基本上來講,是防止在寫未完成的時候被另外一個線程讀取,造成數據錯誤。而這種機制是耗費系統資源的,所以在iPhone這種小型設備上,如果沒有使用多線程間的通訊編程,那麼nonatomic是一個非常好的選擇。 
指出訪問器不是原子操作,而預設地,訪問器是原子操作。這也就是說,在多線程環境下,解析的訪問器提供一個對屬性的安全訪問,從獲取器得到的返回值或者通過設置器設置的值可以一次完成,即便是別的線程也正在對其進行訪問。如果你不指定 nonatomic ,在自己管理記憶體的環境中,解析的訪問器保留並自動釋放返回的值,如果指定了 nonatomic ,那麼訪問器只是簡單地返回這個值。

 

assign:  簡單賦值,不更改索引計數

copy: 建立一個索引計數為1的對象,然後釋放舊對象

retain: 釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1

copy與retain:  copy其實是建立了一個相同的對象,而retain不是:  比如一個NSString對象,地址為0×1111,內容為@”STR” ,Copy到另外一個NSString之後,地址為0×2222,內容相同,新的對象retain為1,舊有對象沒有變化, retain到另外一個NSString之後,地址相同(建立一個指針,指針拷貝),內容當然相同,這個對象的retain值+1 ,也就是說,retain是指針拷貝,copy是內容拷貝。哇,比想象的簡單多了…

assign與retain:  copy其實是建立了一個相同的對象,而retain不是: 

1. 接觸過C,那麼假設你用malloc分配了一塊記憶體,並且把它的地址賦值給了指針a,後來你希望指針b也共用這塊記憶體,於是你又把a賦值給(assign)了b。此時a和b指向同一塊記憶體,請問當a不再需要這塊記憶體,能否直接釋放它?答案是否定的,因為a並不知道b是否還在使用這塊記憶體,如果a釋放了,那麼b在使用這塊記憶體的時候會引起程式crash掉。

 

2.瞭解到1中assign的問題,那麼如何解決?最簡單的一個方法就是使用引用計數(reference counting),還是上面的那個例子,我們給那塊記憶體設一個引用計數,當記憶體被分配並且賦值給a時,引用計數是1。當把a賦值給b時引用計數增加到2。這時如果a不再使用這塊記憶體,它只需要把引用計數減1,表明自己不再擁有這塊記憶體。b不再使用這塊記憶體時也把引用計數減1。當引用計數變為0的時候,代表該記憶體不再被任何指針所引用,系統可以把它直接釋放掉。

 

總結:上面兩點其實就是assign和retain的區別,assign就是直接賦值,從而可能引起1中的問題,當數據為int, float等原生類型時,可以使用assign。retain就如2中所述,使用了引用計數,retain引起引用計數加1, release引起引用計數減1,當引用計數為0時,dealloc函數被調用,記憶體被回收。

__nullable和__nonnull 
__nullable表示可以為nil 
__nonnull表示不可以為nil


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 恢復內容開始 ODI流程 Topology 1、建立 源 物理結構體系 2、建立 目的 物理結構體系 步驟同上 3、建立 源 邏輯架構 4、建立 目的 邏輯架構 步驟同上 Designer 5、建立 源 模型 點擊 6、建立 目的 模型 步驟同上 7、建立項目 8、 導入模塊 路徑為 :F:\Ora ...
  • 1 /*修改欄位類型*/ 2 alter table 表名 ALTER COLUMN 列名 nvarchar(500) 3 go 4 /*增加欄位和說明*/ 5 alter table 表名 add 列名 nvarchar(50) 6 EXECUTE sp_addextendedproperty N... ...
  • map reduce的解釋 這是一張來自mongodb mapreduce圖示,比較能說明問題 其實我們可以從word count這個實例來理解MapReduce。MapReduce大體上分為六個步驟:input, split, map, shuffle, reduce, output。細節描述如下 ...
  • 本文簡述在Android開發中佈局的簡單應用,屬於基礎知識,僅供學習分享使用。 ...
  • android底部增加背景 底部陰影寬度為1,若是左邊右邊上邊需要陰影按照這個方法加上left,right,top就好了 ...
  • 在ObjC中,什麼是深淺拷貝? 深淺拷貝分別指深拷貝和淺拷貝,即 mutableCopy 和 copy 方法。 copy複製一個不可變對象,而 mutableCopy 複製一個 mutable 可變對象。 非容器類對象 如NSString,NSNumber等一類對象 示例1: 查看記憶體可以發現,st ...
  • 概述 從前面的博文我們也可以看到,數組和字典中只能存儲對象類型,其他基本類型和結構體是沒有辦法放到數組和字典中的,當然你也是無法給它們發送消息的也就是說有些NSObject的方法是無法調用的,這個時候通常會用到裝箱boxing和拆箱unboxing。 其實各種高級語言基本上都有裝箱和拆 箱的過程,例 ...
  • 為什麼使用MVVM iOS中,我們使用的大部分都是MVC架構。雖然MVC的層次明確,但是由於功能日益的增加、代碼的維護,使得更多的代碼被寫在了Controller中,這樣Controller就顯得非常臃腫。為了給Controller瘦身,後來又從MVC衍生出了一種新的架構模式MVVM架構。 MVVM ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...