屬性變量,實例變量,全局變量


對於屬性,我們第一時間就會想到 self.name,@property,如:

@property(nonatomic,copy) NSString *name; 

這里的name 被我們稱為屬性變量,或是成員變量。
對於這種:

@interface Person() { NSString *_shortname; } 

我們稱為實例變量。
區別:成員變量 = 實例變量 + 存取方法(setter,getter)。
比如:當我們使用self.name = @"name" 的時候實際上是使用了namesetter方法,對實例變量_name進行了賦值。

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

當我們讀取self.name的值的時候,實際上是通過getter方法獲取_name的值。

-(NSString *)name { return _name; } 

注意:1.如果你需要同時重寫namesettergetter方法的時候,你需要使用

@synthesize name = _name; 

2.在init方法中不要使用self.來調用屬性。self.這種方式會調用存取方法,需要一個已經完全初始化好的對象來進行操作,而在init方法中,存在着self沒有完全初始化好的的情況,可能會出現一些莫名其妙的問題。
局部變量就不再贅述,對於全局變量,首先要說明_name這種不叫全局變量!!!全局變量的定義一般是這個樣子的:

NSString * Phone = @"138xxxxxxxxxx"; 

需要注意的一點是,當我們使用const聲明全局變量之后,表示該值是不可修改的。

NSString * const Phone = @"138xxxxxxxxxx"; 

對於static來說,static 是限定該變量的作用范圍只在定義該變量的編譯單元中有效,一般都是在.m文件中使用static定義,表示只在當前類中可以使用。當然,如果是暴露在.h文件中,只要導入該類的頭文件自然是可以使用Phone的。

static NSString * const Phone = @"138xxxxxxxxxx"; 

如果不加static 就表示該變量可以在其它類中使用,只需要在使用前在該類中使用extern 引用該變量即可。
關於const位置的問題 參考 http://www.jianshu.com/p/f83335e036b5

注意:如果在extern引用的時候沒有添加const關鍵字,即便是在定義時聲明該值不可變,該值仍然是可以被改變的。

extern NSString *Phone; Phone = @"xxxxxxxxxxx138"; NSLog(@"%@", Phone); 
 
const.png


作者:墨笑白
鏈接:https://www.jianshu.com/p/a5e5f487ef0e
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

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



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