iOS中成員變數和屬性區別

2021-08-04 17:07:58 字數 2638 閱讀 3060

接觸ios的人都知道,@property宣告的屬性缺省會生成乙個_型別的成員變數,同時也會生成setter/getter方法。 

但這只是在ios5之後,蘋果推出的乙個新機制。看老**時,經常看到乙個大括號裡面定義了成員變數,同時用了@property宣告,而且還在@implementation中使用@synthesize方法。 

如下:demo

@inte***ce

viewcontroller ()

//2.在用@property

@property(nonatomic, copy) nsstring *mystring;

@end

@implementation

viewcontroller

//3.最後在@implementation中用synthesize生成set方法

@synthesize mystring;

@end

其實,發生這種狀況根本原因是蘋果將預設編譯器從gcc轉換為llvm(low level virtual machine),才不再需要為屬性宣告例項變數了。

在沒有更改之前,屬性的正常寫法需要成員變數+ @property + @synthesize 成員變數三個步驟。 

如果我們只寫成員變數+ @property:

@inte***ce

gbviewcontroller :uiviewcontroller

@property (nonatomic, strong) nsstring *mystring;

@end

編譯時會報警告:

autosynthesized property 'mystring' will use synthesized instance variable

'_mystring', not existing instance variable

'mystring'

但更換為llvm之後,編譯器在編譯過程中發現沒有新的例項變數後,就會生成乙個下劃線開頭的例項變數。因此現在我們不必在宣告乙個例項變數。(注意:==是不必要,不是不可以==) 

當然我們也熟知,@property宣告的屬性不僅僅預設給我們生成乙個_型別的成員變數,同時也會生成setter/getter方法。

.m檔案中,編譯器也會自動的生成乙個例項變數_mystring。那麼在.m檔案中可以直接的使用_mystring例項變數,也可以通過屬性self.mystring.都是一樣的。

注意這裡的self.mystring其實是呼叫的mystring屬性的setter/getter方法。這與c++中點的使用是有區別的,c++中的點可以直接訪問成員變數(也就是例項變數)。

例如在oc中有如下**

@inte***ce

myviewcontroller :uiviewcontroller

@end

在這段**裡面只是宣告了乙個成員變數,並沒有setter/getter方法。所以訪問成員變數時,可以直接訪問name,也可以像c++一樣用self->name來訪問,但絕對不能用self.name來訪問。

首先我們要明白,@synthesize生成了setter/getter方法。 

雖然現在直接使用@property時,編譯器會自動為你生成以下劃線開頭的例項變數_mystring,不需要自己手動再去寫例項變數。而且也不在.m檔案中通過@synthesize mystring;生成setter/getter方法。但在看老**的時候,我們依舊可以看到有人使用成員變數+ @synthesize 成員變數的形式。

那麼問題來了:

我們能否認為新編譯器llvm下的@property== 老編譯器gcc的成員變數+ @property + @synthesize 成員變數呢?

答案是否定的。 

因為成員變數+ @property + @synthesize 成員變數的形式,編譯器不會幫我們生成_成員變數,因此不會操作_成員變數了; 

同時@synthesize還有乙個作用,可以指定與屬性對應的例項變數, 

例如@synthesize mystring = ***;

那麼self.mystring其實是操作的例項變數***,而非_string了。

頂 2

解惑 iOS中成員變數和屬性區別

接觸ios的人都知道,property宣告的屬性缺省會生成乙個 型別的成員變數,同時也會生成setter getter方法。但這只是在ios5之後,蘋果推出的乙個新機制。看老 時,經常看到乙個大括號裡面定義了成員變數,同時用了 property宣告,而且還在 implementation中使用 sy...

iOS成員變數和屬性

成員變數的優點 1.能夠定義作用於 protect public package private 2.不走setter和getter方法,讀取速度快 這個走的是什麼 屬性1.能夠定義讀寫屬性,原子屬性,setter和getter方法名稱 2.不需要自己去管理記憶體 這裡有個疑問 就是在解除迴圈引用的...

iOS面試 屬性 成員變數

成員變數 是不與外界接觸的變數,應用於類的內部。ps 如果你說那用 public 外部不就是可以訪問了麼?確實是可以,但是 public 只能適當使用,不要氾濫,否則就像你把鑰匙插在你自己家門上了,誰來都可以開門,毫無安全性。屬性 個人認為最大的好處就是讓其他物件可以訪問這個變數。而且你可以設定唯讀...