iOS 成員變量和屬性的區別


一. 成員變量

1.成員變量的作用范圍:

@public:在任何地方都能直接訪問對象的成員變量
@private:只能在當前類的對象方法中直接訪問,如果子類要訪問需要調用父類的get/set方法
@protected:可以在當前類及其子類對象方法中直接訪問(系統默認下是用它來修飾的)
@package:在同一個包下就可以直接訪問,比如說在同一個框架

2.注意:

無論父類是在@interface還是@implementation聲明的成員變量子類都能擁有;但是子類能不能直接通過變量名來訪問父類中定義的成員變量是需要看父類中定義的成員變量是由什么修飾符來修飾的。

3.默認:

在.m中成員變量的修飾符為@private.
在.h中成員變量的修飾符@protected.

  • 下面給大家演示下代碼:
 
創建一個學生類,然后分別在.h跟.m中聲明4中不同的類型的變量,創建一個MidStudent來繼承Student
  • 我們在MidStudent中來調用下看看這些變量哪些可以訪問哪些不可以:


     
    有圖可以看出,我們在.m里面聲明的變量子類是無法訪問的(即使給他@public),也會被認為是@private,所以我們的對外屬性都會放到.h去聲明,然而由於six變量是@private,所以子類還是無法訪問的
  • 我們再去外部去調用下MidStudent 對象 看看是什么效果


     
    由於我們沒有在Student或他的子類里面,所以只能訪問.h中@public修飾的變量,也就是name,由於age是@protrcted在外部是不能被訪問的!

二. 屬性

關於屬性的詳細說明我就不在這里做過多的說明了,請查詢下面的網址:
Objective-C 編程語言官網文檔(五)-屬性的聲明

  • 關於@synthesize object = _object 的解釋
    我們可能見過很多地方都有這樣的代碼:
 
1.@property的作用是定義屬性,聲明getter,setter方法。(注意:屬性不是變量) 2.@synthesize的作用是實現屬性的,如getter,setter方法 3.總結:一定要分清屬性和變量的區別,不能混淆。@synthesize 聲明的屬性=變量。意思是,將屬性的setter,getter方法,作用於這個變量。 4.但Xocde4.5以后,編譯器會為你自動實現setter及getter方法,如果他找不到_father,會為你自動創建一個_father的變量
  • 聲明屬性的時候會有一些關鍵詞這里簡單說下他們的含義:
atomic: 原子性

在objective-c 屬性設置里面 默認的就是atomic ,意思就是 setter /getter函數是一個原子操作,如果多線程同時調用setter時,不會出現某一個線程執行完setter所有語句之前,另一個線程就開始執行setter,相當於 函數頭尾加了鎖 . 這樣的話 並發訪問性能會比較低 .

nonatomic: 非原子性

非原子操作 一般不需要多線程支持的時候就用它,這樣在 並發訪問的時候效率會比較高 . 在objective-c里面通常對象類型都應該聲明為非原子性的. iOS中程序啟動的時候系統只會自動生成一個單一的主線程.程序在執行的時候一般情況下是在同一個線程里面對一個屬性進行操作.

getter=getterName

指定 get 方法,並需要實現這個方法 。必須返回與聲明類型相同的變量,沒有參數.相當於重新命名getter方法

setter=setterName:

指定 set 方法,並需要實現這個方法 。帶一個與聲明類型相同的參數,沒有返回值(返回空值)

當聲明為 readonly 的時候,不能指定 set 方法


 
重新聲明setter,getter方法
readwirte

如果沒有聲明成 readonly ,那就 默認是 readwrite 。可以用來賦值,執行set方法

readonly

不可以被賦值

assgin

通常用於標量(簡單變量 int , float , CGRect 等)
一種典型情況是用在對對象沒有所有權的時候,通常是 delegate ,避免造成死循環(如果用 retain 的話會死循環)

strong

釋放舊對象 將舊對象的值賦予輸入對象 ,再提高輸入對象的索引計數為 1 ,常使用在繼承自 NSObject 的類。(MRC為retain)

weak

weak 不增加對對象的引用計數,也不持有對象,因此不能決定對象的釋放。它比 assign 多了一個功能,當對象消失后自動把指針變成 nil

copy

建立一個索引計數為 1 的對象 然后釋放舊對象 對 NSString 它指出 ,在賦值時使用傳入值的一份拷貝 ,拷貝工作由 copy 方法執行,此屬性只對那些實行了 NSCopying 協議的對象類型有效。




轉自:https://www.jianshu.com/p/6ca11cbe4187


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM