@property中的copy.strong.weak總結

来源:http://www.cnblogs.com/liyy2015/archive/2016/03/15/5271030.html
-Advertisement-
Play Games

1.NSString類型的屬性為什麼用copy   NSString類型的屬性可以用strong修飾,但會造成一些問題,請看下麵代碼   2016-03-15 10:10:25.772 string[619:12684] 可變字元串修改前nameStrong= zhangsan nameCopy=z


1.NSString類型的屬性為什麼用copy

  NSString類型的屬性可以用strong修飾,但會造成一些問題,請看下麵代碼

 

#import "ViewController.h"

@interface ViewController ()

@property(nonatomic,strong) NSString *nameStrong;

@property(nonatomic,copy) NSString *nameCopy;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
    NSMutableString *muStr = [NSMutableString stringWithString:@"zhangsan"];
    self.nameCopy = muStr ;
    self.nameStrong = muStr;
    NSLog(@"可變字元串修改前nameStrong= %@ nameCopy=%@",self.nameStrong,self.nameCopy);
    [muStr appendString:@"feng"];
     NSLog(@"可變字元串修改後nameStrong= %@ nameCopy=%@",self.nameStrong,self.nameCopy);
    
}
列印結果如下:

2016-03-15 10:10:25.772 string[619:12684] 可變字元串修改前nameStrong= zhangsan nameCopy=zhangsan


2016-03-15 10:10:25.773 string[619:12684] 可變字元串修改後nameStrong= zhangsanfeng nameCopy=zhangsan

可變字元串改變時,strong修飾的字元串也跟著改變了,而copy修飾的字元串沒有改變

 

  總結:用strong修飾的字元串,當NSMutableString的字元串給他賦值時,NSMutableString的字元串變了,它也會跟著改變,因為stong只是指針的引用,引用計數加1。

  用copy修飾的字元串,不會隨著源頭的改變而改變,因為copy會複製一份。

 如果源頭的字元串是不可變的,那麼用copy和strong是一樣的,因為源頭是不可變的字元串嘛,所以用copy還是strong看你的需要了,想讓他隨著源頭改變就用strong,不想改變有用copy,一般不會讓它改變,所以安全起見,字元串會用copy

 

2.代理.手動拖線的控制項為什麼用weak

  self->對象(比如person對象)->代理->self(設置代理時:self.delegate=self);

  會造成迴圈引用, 使用weak表明該屬性定義了一種非擁有關係,為這種屬性設置新值時,既不保留新值也不會釋放舊值。

  首先手動拖線的控制項用weak不是因為會造成迴圈引用,self->view->sunViews->控制項,這樣已經有個強引用了,如果控制項用strong,self->控制項,這個控制項有兩個強引用,釋放時要剪斷兩個對他的引用,如果有一個沒有釋放,這個控制項就不能釋放了,當然用strong也沒有錯,還更加安全呢。

 

3.block為什麼用copy

  block的方法內容是在棧區的,首先棧區是系統自動管理的,隨時會清除記憶體,,再訪問時可能會造成野指針,copy關鍵字會把block的內容複製到堆區,堆區由程式員自己管理。

 


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

-Advertisement-
Play Games
更多相關文章
  • 在一些場景中,需要限制用戶的輸入字數,例如在textField里進行控制(textView也類似,崩潰原因也相同),如圖所示 系統會監聽文本輸入,需要註意的第一點是輸入法處於聯想輸入還未確定提交的時候,對於第三方輸入法例如搜狗,聯想狀態下的輸入,是監聽不到,除非點擊確定輸入到textField,才會
  • 單機搭建Android開發環境四,介紹了基於64位Ubuntu 12.04 Server版安裝git、repo、編譯環境,從內部伺服器下載Android5.1代碼並編譯測試。
  • 第二個界面中的lable顯示第一個界面textField中的文本 首先我們建立一個RootViewControllers和一個DetailViewControllers,在DetailViewControllers中聲明一個textString屬性,用於接收傳過來的字元串, RootViewCont
  • 面向對象編程進階和字元串 Δ一.類的設計模式—單例 【單例】程式允許過程中,有且僅有一塊記憶體空間存在,這種類的設計模式成為單例 【問】什麼時候用到單例 【答】數據共用的時候 1.單例的書寫格式 以+(加號)開頭的方法,可以直接被類調用;-(減號)開頭方法 ,是對象方法,用對象來調用; 2.認識單例
  • 首先創建2個新界面 , 然後創建一個類,如下圖   然後在AppDeleate.h   然後在AppDeleate.m中  然後進入AppStatus.h    AppStatus.m   FirstViewController.h中    FirstViewController.m中   Seco
  • ContentProvider是不同應用程式之間進行數據交換的一種方式或者稱標準API. http://www.qq.com:80/news.jsp ContentProvider要求的;Uri與上面類似   在AndroidManifest.xml中註冊ContentProvider,指定 建立一
  •  
  •   首先:自定義一個漸變視圖,在自定義視圖中重寫drawRect  接下來主要分為5步   步驟還是和上面一樣!     作者: 清澈Saup出處: http://www.cnblogs.com/qingche/本文版權歸作者和博客園共有,歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文連
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...