1. 程式人生 > >OC get set 方法理解 get set方法不能同時重寫

OC get set 方法理解 get set方法不能同時重寫

最近在瞭解Xcode 對 @property 所做的事情
我們都知道用@property 宣告的屬性 Xcode 會幫我們生成get set 方法,有時我們根據實際需要會重寫get 或者set 方法.都是可以的.但是我們get set 方法都重寫,就會報錯
這裡寫圖片描述

原因是: @property 已經幫我們重寫了get set 方法 ,而現在我們又全部重寫了get set 方法.導致Xcode 認為我們寫的這 get set 方法的屬性和@propery 宣告的屬性不是同一個屬性了,所以會報錯. 類似於 @property (nonatomic) NSString * name; 依然是Xcode 幫寫get set 方法,但是 自己寫的 get set 方法沒有對應的屬性宣告.

如果非要重寫get set 兩個方法
這裡寫圖片描述

如上圖
加一個第 14 行程式碼的宣告. 表示我們自己宣告一個屬性,但是沒事get set方法 需要自己重寫
這樣一來第16行 程式碼可有可無.

  • 若 沒有第16行 就類似c++ 一樣了.無法突出oc 特性
  • 加了第16 行程式碼 就有真正OC語言的特性,一見到@property 就知道有get set 方法

當沒有第16行程式碼,我們又重寫了get 和set 方法,這個屬性的get set 方法是我們自己實現

但是同時又有第16 行程式碼 ,Xcode 會處理髮現 @property 和我們自己宣告的東西是同一個屬性,我們宣告的get set 方法 會覆蓋Xcode生成的get set 方法

這裡面又涉及到兩個屬性@synthesize 和 @dynamic

引用一段話:

iOS 6 之後 LLVM 編譯器引入property autosynthesis,即屬性自動合成。換句話說,就是編譯器會為每個 @property 新增 @synthesize ,如以下形式:
@synthesize propertyName = _propertyName;
這行程式碼會創造一個帶下劃線字首的例項變數名,同時使用這個屬性生成getter 和 setter 方法。
使用@synthesize 只有一個目的——給例項變數起個別名,或者說為同一個變數新增兩個名字。
如果要阻止自動合成,記得使用 @dynamic 。經典的使用場景是你知道已經在某處實現了getter/setter 方法,而編譯器不知道的情況。
此處我的理解是為了防止編譯器使用自動合成生成新的setter/getter 會覆蓋已經存在的舊的 setter/getter。
自動合成沒有任何記憶體的含義,所以它根本沒有連線到ARC。
如果你已經手動實現了 setter/getter方法,或著對 只讀物件 實現了getter方法,那麼自動合成不會產生任何影響。如果你在手動實現需要一個變數,只需宣告它就可以了,不需要新增@synthesize來新增一個別名(儘管可以)。
還有一種情形需要使用 @synthesize ,就是當在 protocol 代理 中宣告並實現屬性時。協議中宣告的屬性不會自動生成setter和getter,

總結
[email protected] 的作用:是為屬性新增一個例項變數名,或者說別名。同時會為該屬性生成 setter/getter 方法。
2.禁止@synthesize:如果某屬性已經在某處實現了自己的 setter/getter ,可以使用 @dynamic 來阻止 @synthesize 自動生成新的 setter/getter
3.記憶體管理:@synthesize 和 ARC 無關。
4.使用:一般情況下無需對屬性新增 @synthesize ,但一些特殊情形仍然需要,例如protocol中宣告的屬性。

上圖中第14行程式碼 就是@synthesize 的作用 起到一個宣告 下劃線屬性的作用 但是 getset 方法是我們自己實現的

這裡寫圖片描述

這種情況下編譯是沒有錯的,但是run 一下就會出錯,
@dynamic name;
禁止生成 get set 方法了
如果我們把上圖的註釋放開,run 一下也是正常的.

@property (nonatomic) NSString * name;

等同於

{
NSString * _name;
}
-(void)setName:(NSString *)name {
_name = name;
}
-(NSString*)name {
return _name;
}

後者會覆蓋前者的方法實現

有更好的理解或者理解的不對不全
歡迎交流: [email protected]

相關推薦

OC get set 方法理解 get set方法不能同時重寫

最近在瞭解Xcode 對 @property 所做的事情 我們都知道用@property 宣告的屬性 Xcode 會幫我們生成get set 方法,有時我們根據實際需要會重寫get 或者set 方法.都是可以的.但是我們get set 方法都重寫,就會報錯

簡單理解java為什麼要同時重寫equals方法和hashcode

一、從集合和資料結構說起       這幾天在部落格上看關於為什麼重寫equals方法的同時也要重寫hashcode方法,越看越糊塗,後來自己仔細一想,本來很簡單的事情為何說的那麼麻煩。現在我來一一說說我的理解。     在資料結構中我們學習過查詢,但是實踐的比較少。而ja

JAVA基礎get/set方法理解

前言 在初學JAVA的時候,對最基礎的get()和set()方法一直很疑惑。 當我們將某些變數屬性設定為private(私有)後,就必須通過設定setXXX和getXXX方法來完成對成員變數的賦值和取值操作。 在剛開始學習java時一直很疑惑為什麼不直接將成員變數設為public(公

黑馬程式設計師——OC基礎——set方法get方法

-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 我們在OC中定義一個類的時候,它的成員變數預設情況下是@protected的。這是因為我們的成員變數一般不允許直接去訪問,如果需要修改和訪問成員變數我們

黑馬程式設計師-OC學習筆記-點方法、成員變數作用域以及set方法get方法@property的綜合題

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- 1.  OC建立物件的拓展: Frac

C語言復雜struct類型get或者set字段的簡化方法

難度 很多 今天 class 作者 prop 簡化 http if else p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } span.s1 { fo

Python進階-----property用法(實現了getset,delete三種方法)

一、可以利用property對靜態屬性的進行修改操作,包括設定和刪除屬性   1、呼叫靜態屬性===>在靜態屬性函式前先用@property;   2、設定靜態屬性===>在靜態屬性函式前加上@靜態屬性函式名.setter,同時靜態屬性函式要加上value引數;   3、刪除靜態屬性===>

java:Eclipse使用快捷鍵,快速建立構造方法get/set方法

`public class person { private String name; private int age; public person() {//alt+shift+s 在加c,建立父類空參建構函式 super(); } public person(String nam

ios基礎之屬性set get方法同時重寫報錯的問題

今天有一個初學者遇到一個問題,就是使用property的時候,同時重寫set get方法會報錯,如 #import <UIKit/UIKit.h> @interface ViewController : UIViewController{ } @propert

java中get方法,和set方法的使用例項

public class test1 {public static void main(String arg[]){test2 t1=new test2();System.out.println(t1.getT());//獲取t的值t1.setT(8);System.out.println(t1.getT()

java set get訪問器理解

簡述 java中習慣將類的成員變數屬性設定為私有(private),並通過設定setXXX和getXXX方法來完成對成員變數的賦值和取值操作。在剛開始學習java時一直很疑惑為什麼不將成員變數設為公有(public),直接操作成員變數不是更方便嗎?其實這樣設計是源於jav

在php中分別使用curl的post提交數據的方法get獲取網頁數據的方法

per 網頁 var ror ring fun 方法 header 語句 在php中分別使用curl的post提交數據的方法和get獲取網頁數據的方法整理分享一下額,具體代碼如下: (1)使用php curl獲取網頁數據的方法: $ch=curl_init(); //設

java中Set集合的遍歷方法

基本數據類型 對象 叠代器 比較 for hashset 循環 sta ins S兒童集合的遍歷: 第一種:for增強循環 Set<String> set = new HashSet<String>(); for (String str : set

HTTP 方法GET 對比 POST

htm tag 客戶 ascii 以及 傳輸協議 data 表示 pre HTTP 方法:GET 對比 POST HTTP 消息 標簽列表(字母排序) 兩種最常用的 HTTP 方法是:GET 和 POST。 什麽是 HTTP? 超文本傳輸協議(HTTP)的設計

》》HTTP 方法GET 對比 POST《《Java:SpringMVC:基礎知識:Http協議()

ipa .com 常用 code 有關 strong 註意 part html_ http://www.w3school.com.cn/tags/html_ref_httpmethods.asp 兩種最常用的 HTTP 方法是:GET 和 POST。 —————————

set,pair容器使用方法

ast -- const mas span tps gym follow type 題目鏈接:http://codeforces.com/gym/100989/problem/D In this cafeteria, the N tables are all ordered

$.ajax()方法和$.get()方法使用小結

con 後臺程序 程序 htm null lse min .ajax 圖片 一. 使用JQuery的$.get()方法實現異步請求 1. 編寫JSP 1 <!DOCTYPE html> 2 <html lang="en"> 3 <hea

Dockerfile中npm中Error: could not get uid/gid問題的解決方法

dockerfile 中  使用 npm 的時候報錯:   解決辦法: https://github.com/tootsuite/mastodon/issues/802     &nbs

GET和POST兩種請求方法的區別(RFC翻譯)

  GET和POST方法是HTTP協議規定的。查了HTTP1.1的RFC,原文的專業性極強。下面是白話翻譯,歡迎補充和指錯。   GET方法就是檢索(以實體的形式)由請求uri所指定的資源。如果請求的uri指向資料產生的過程,應該把產生的資料應作為實體在響應中返回而不是源文字,除非原始檔指向輸出過

ubuntu apt-get一直報錯的解決方法

apt-get -f install 這條指令就是用來修正一些軟體依賴中存在的錯誤,敲進入之後出現了:磁碟空間已滿,寫入失敗, 其實這個並不是你的空間不夠了,是因為你安裝的包太多的緣故,可以手動清除一些 首先檢視一下我們當前已經安裝了哪些軟體  dpkg -l 如果你不