最近看了多好關于實例變量 跟屬性的一些資料,在這里做一些簡單的總結,下面我們直接進入正題.
一. 成員變量
1.成員變量的作用范圍:
@public:在任何地方都能直接訪問對象的成員變量
@private:只能在當前類的對象方法中直接訪問,如果子類要訪問需要調用父類的get/set方法
@protected:可以在當前類及其子類對象方法中直接訪問(系統默認下是用它來修飾的)
@package:在同一個包下就可以直接訪問,比如說在同一個框架
2.注意:
無論父類是在@interface還是@implementation聲明的成員變量子類都能擁有;但是子類能不能直接通過變量名來訪問父類中定義的成員變量是需要看父類中定義的成員變量是由什么修飾符來修飾的。
3.默認:
在.m中成員變量的修飾符為@private.
在.h中成員變量的修飾符@protected.
- 下面給大家演示下代碼:
-
我們在MidStudent中來調用下看看這些變量哪些可以訪問哪些不可以:
有圖可以看出,我們在.m里面聲明的變量子類是無法訪問的(即使給他@public),也會被認為是@private,所以我們的對外屬性都會放到.h去聲明,然而由于six變量是@private,所以子類還是無法訪問的 -
我們再去外部去調用下MidStudent 對象 看看是什么效果
由于我們沒有在Student或他的子類里面,所以只能訪問.h中@public修飾的變量,也就是name,由于age是@protrcted在外部是不能被訪問的!
二. 屬性
關于屬性的詳細說明我就不在這里做過多的說明了,請查詢下面的網址:
Objective-C 編程語言官網文檔(五)-屬性的聲明
- 關于@synthesize object = _object 的解釋
我們可能見過很多地方都有這樣的代碼:
- 聲明屬性的時候會有一些關鍵詞這里簡單說下他們的含義:
atomic: 原子性
在objective-c 屬性設置里面 默認的就是atomic ,意思就是 setter /getter函數是一個原子操作,如果多線程同時調用setter時,不會出現某一個線程執行完setter所有語句之前,另一個線程就開始執行setter,相當于 函數頭尾加了鎖 . 這樣的話 并發訪問性能會比較低 .
nonatomic: 非原子性
非原子操作 一般不需要多線程支持的時候就用它,這樣在 并發訪問的時候效率會比較高 . 在objective-c里面通常對象類型都應該聲明為非原子性的. iOS中程序啟動的時候系統只會自動生成一個單一的主線程.程序在執行的時候一般情況下是在同一個線程里面對一個屬性進行操作.
getter=getterName
指定 get 方法,并需要實現這個方法 。必須返回與聲明類型相同的變量,沒有參數.相當于重新命名getter方法
setter=setterName:
指定 set 方法,并需要實現這個方法 。帶一個與聲明類型相同的參數,沒有返回值(返回空值)
當聲明為 readonly 的時候,不能指定 set 方法
readwirte
如果沒有聲明成 readonly ,那就 默認是 readwrite ??梢杂脕碣x值,執行set方法
readonly
不可以被賦值
assgin
通常用于標量(簡單變量 int , float , CGRect 等)
一種典型情況是用在對對象沒有所有權的時候,通常是 delegate ,避免造成死循環(如果用 retain 的話會死循環)
strong
釋放舊對象 將舊對象的值賦予輸入對象 ,再提高輸入對象的索引計數為 1 ,常使用在繼承自 NSObject 的類。(MRC為retain)
weak
weak 不增加對對象的引用計數,也不持有對象,因此不能決定對象的釋放。它比 assign 多了一個功能,當對象消失后自動把指針變成 nil
copy
建立一個索引計數為 1 的對象 然后釋放舊對象 對 NSString 它指出 ,在賦值時使用傳入值的一份拷貝 ,拷貝工作由 copy 方法執行,此屬性只對那些實行了 NSCopying 協議的對象類型有效。