從 property說起(一)開題篇

2021-09-16 23:25:01 字數 2156 閱讀 9840

@property可以說是每乙個ios開發者最常用的一句**,甚至沒有之一。但是,在上古的xcode 4.4時代之前,事情並不是這個樣子的。

當時的ios開發者,每當需要乙個屬性的時候。總是需要寫這麼幾句話:

.h

@property nsobejct *foo;

.m@synthesize foo = _foo;

標頭檔案中加上@property,那麼編譯器會自動新增下面一段**:

- (nsobject *)foo;   

- (void)setfoo:(nsobject *)newfoo;

也就是屬性的setter和getter的宣告。

那麼@synthesize就是對應等效地實現了setter和getter。

- (nsobject *)foo   

- (void)setfoo:(nsobject *)newfoo

而自從xcode4.5開始,喜大普奔,開發者只需要使用一句

@property nsobject *foo;
就能直接做完三件事:

生成乙個_foo名稱的成員變數;

宣告foo屬性的setter和getter方法;

預設實現宣告的兩個setter和getter方法;

那麼在後來的xcode中,@synthesize還有什麼用處呢?

首先我們在乙個控制器中,總是需要使用self.view來操作控制器的view屬性,而沒法用_view成員變數來直接使用。這個就是因為我們預設的成員變數的宣告,是在.m中用@synthesize view = _view;這種格式來宣告的。那麼繼承自uiviewcontorller自然是取不到.m中宣告的成員變數。於是,我們如果繼承了乙個父類,在用父類屬性的成員變數時,就需要用@synthesize foo = _foo; 來在子類中使用。

然鵝其實還有乙個相關的關鍵字,很少見。它就是@dynamic。

@dynamic 的意思就是跟系統說,不要建立 property 對應的成員變數(就是一般的 _someproperty),也不要自動生成 get/set 方法,同時不要報錯,到在執行時我自己會來新增 get/set 方法。比如像 coredata 的物件,有些屬性並不是用 _someproperty 存起來的,而是從資料庫裡讀出來的。那麼就不需要系統預設的 getter、setter,而是在執行時生成。

但是我們在開發中,更多所寫的,是這個樣子

@property (nonatomic, weak) uiview *backgroudview;
那麼括號裡面的東西,到底又做了什麼,乙個好的開發者,決不能容忍自己寫下的一段**不知道它的真實作用。

實際上,在括號裡的東西,叫做屬性的attribute,特徵,或者叫特質。乙個屬性可以擁有的attribute,可以有四種:

原子性有兩個關鍵字,atomic和nonatomic,很好理解。原子性和非原子性。如果是atomic修飾的屬性,那麼在預設生成的setter和getter方法中,會通過鎖定機制確保屬性的atomicity。但是原子性是不能保證執行緒安全的,這個問題隨意搜一下就有答案,不再贅述。那麼nonatomic自然就是不加鎖的。

預設屬性會新增readwrite,同時生成setter和getter,所以本質上是由@synthesize來實現的。

而readonly就是代表只生成getter方法,而只能讀的屬性顯然沒有意義,所以,readonly屬性一般都需要在這個類的實現中直接使用例項變數賦值,或者在class extension中重新定義為讀寫屬性。

這個很簡單,就是使用getter=或setter=來指定方法名,用來更改預設的訪問成員變數的方法名稱,一般只是在bool型別屬性時常用。

這個就是那個經久不衰的問題點。實際上,屬性用來封裝資料,但是資料本身需要有所有權,所以記憶體管理的關注點在於持有方式,而不需要關心使用方式。所以,記憶體管理關鍵字影響的是setter方法的實現,本質上,是成員變數對賦值的持有方式。

我們暫時只研究arc下的幾個關鍵字,assign,strong,weak,copy和unsafe_unretained(沒錯,這個也是arc支援的修飾)。

先簡單認知一下它們的特徵,更深入的問題,在之後一篇中詳細研究。

02 從神經元說起 結構篇

神經元與單層感知機 人工神經網路 它是卷積神經網路的基礎。人工神經網路是由乙個個神經元組成的,神經元的人工神經網路中最基礎的計算單元。神經元接受前一層的輸入,經過處理,會有乙個輸出,就像下面這張圖一樣。z的計算方式如下,其中,x1,x2,xk是輸入,w1,w2,wk是權重,b為偏移項,為啟用函式。把...

從留一手說起

2006 7 14 20 15 08 教徒弟武藝,總喜歡留一手,以防萬一。這萬一麼,可能是徒弟在學成之後可能會稱為 的對手,這時 還有更硬底牌。然而,在武藝一代代往下傳的過程中,你留一手他留一手,最後基本上精華部分都入土了。提一件不太相關的事情。高中時,有一些學生極其聰明,可能在同班同學還沒有上高中...

火坑 一切從TimeSpan說起

小編在編寫wpf程式時,需要做乙個判斷 定時使用modbus協議使用quartz.net 定時任務讀取裝置中的資料,同時也使用定時任務判斷是否長時間獲取不到資料的情況,如果程式中超過一分鐘沒有獲取到資料 資料沒有更新 則認為已經掉線。因此在類中使用了datetime型別資料記錄獲取資料的時間。run...