對於屬性,我們第一時間就會想到 self.name
,@property
,如:
@property(nonatomic,copy) NSString *name;
這里的name
被我們稱為屬性變量,或是成員變量。
對於這種:
@interface Person() { NSString *_shortname; }
我們稱為實例變量。
區別:成員變量 = 實例變量 + 存取方法(setter,getter)。
比如:當我們使用self.name = @"name"
的時候實際上是使用了name
的setter
方法,對實例變量_name
進行了賦值。
-(void)setName:(NSString *)name { _name = name; }
當我們讀取self.name
的值的時候,實際上是通過getter
方法獲取_name
的值。
-(NSString *)name { return _name; }
注意:1.如果你需要同時重寫name
的setter
和getter
方法的時候,你需要使用
@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);

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