編譯器指令:app
用來告訴編譯器要作什麼spa
@property:code
@property是編譯器的指令 告訴編譯器在@interface中自動生成setter和getter的聲明orm
@synthesize:blog
@synthesize是編譯器的指令 告訴編譯器在@implementation中自動生成setter和getter的實現get
手動寫setter-getter:編譯器
#import <Foundation/Foundation.h>
@interface Member : NSObject { @public NSString * _name; int _age; NSString * _account; NSString * _password; } - (void) setName: (NSString *) name; - (NSString *) name; - (void) setAge: (int) age; - (int) age; - (void) setAccount: (NSString *)account; - (NSString *) account; - (void) setPassword: (NSString *) password; - (NSString *) password; @end #import "Member.h" @implementation Member - (void) setName: (NSString *) name{ _name = name; } - (NSString *) name{ return _name; } - (void) setAge: (int) age{ _age = age; } - (int) age{ return _age; } - (void) setAccount: (NSString *)account{ _account = account; } - (NSString *) account{ return _account; } - (void) setPassword: (NSString *) password{ _password = password; } - (NSString *) password{ return _password; } @end
使用@property和@synthesize:io
#import <Foundation/Foundation.h> @interface Member : NSObject { @public NSString * _name; int _age; NSString * _account; NSString * _password; } @property NSString * name; @property int age; @property NSString * account; @property NSString * password; @end #import "Member.h" @implementation Member
@synthesize name = _name; @synthesize age = _age; @synthesize account = _account; @synthesize password = _password;
@end
@property和@synthesize說明:編譯
@property:form
編譯器只要看到@property, 就知道咱們要生成某一個屬性的getter/setter方法的聲明
/* - (void)setAge:(int)age; - (int)age; */ // 使用@property等效以上兩句 @property int age;
使用@property做聲明的時候 , 不須要加下劃線 _
// 加上下劃線後等效於如下兩句 @property int _age; /* - (void)set_age:(int)_age; - (int)_age; */
@synthesize:
在@synthesize後面告訴編譯器, 須要實現哪一個@property生成的聲明
/* - (void)setAge:(int)age { _age = age; } - (int)age { return _age; } */ // 使用@synthesize等效以上部分 // 若是成員變量_age不存在,就會自動生成一個私有的成員變量_age(在.m實現文件中) @synthesize age = _age;
告訴@synthesize, 須要將傳入的值賦值給誰和返回誰的值給調用者
/* - (void)setAge:(int)age { _number = age; } - (int)age { return _number; } */ // 若是這樣寫讀寫的是 _number 而不是 _age @synthesize age = _number;
若是在@synthesize後面沒有告訴系統將傳入的值賦值給誰, 系統默認會賦值給和@synthesize後面寫得名稱相同的成員變量
#import <Foundation/Foundation.h> @interface Person : NSObject { @public int _age; int age; } @property int age; @end #import "Person.h" @implementation Person @synthesize age; @end #import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { Person *p = [Person new]; [p setAge:88]; NSLog(@"_age = %i, age = %i", p->_age, p->age); return 0; } /* 輸出結果:2015-09-01 19:13:45.846 synthesize基本使用[813:21032] _age = 0, age = 88 因此 @synthesize age; 讀寫的是 age 屬性而不是 _age 若是成員變量 age 不存在,就會自動生成一個私有的成員變量 age(在.m實現文件中) */
多個屬性能夠經過一行@synthesize搞定,多個屬性之間用逗號鏈接
@synthesize name = _name, age = _age, account = _account, password = _password;
私有成員:
訪問修飾符:
@public
>能夠在其它類中訪問被public修飾的成員變量
>也能夠在本類中訪問被public修飾的成員變量
>能夠在子類中訪問父類中被public修飾的成員變量
@private
>不能夠在其它類中訪問被private修飾的成員變量
>能夠在本類中訪問被private修飾的成員變量
>不能夠在子類中訪問父類中被private修飾的成員變量
@protected
>不能夠在其它類中訪問被protected修飾的成員變量
>能夠在本類中訪問被protected修飾的成員變量
>能夠在子類中訪問父類中被protected修飾的成員變量
注意: 默認狀況下全部的實例變量都是protected
@package
>介於public和private之間的
若是是在其它包中訪問那麼就是private的
若是是在當前代碼所在的包種訪問就是public的
私有變量:
寫在@implementation中的成員變量, 默認就是私有的成員變量, 而且和利用@private修飾的不太同樣, 在@implementation中定義的成員變量在其它類中沒法查看, 也沒法訪問, 這種私有變量只能在本類中訪問
在@interface中定義的變量, 不管使用什麼成員變量修飾符修飾(包括@private), 咱們均可以在其它類中看到這個變量 只不過有得修飾符修飾的變量咱們不能操做而已
私有方法:
若是隻有方法的實現, 沒有方法的聲明, 那麼該方法就是私有方法 不過在OC中沒有真正的私有方法, 由於OC是消息機制
// 訪問只有實現沒有聲明的私有方法 id pp = [Person new]; [pp test]; Person *p = [Person new]; [p performSelector:@selector(test)];
@property加強
1 從Xcode4.4之後apple對@property進行了一個加強, 之後只要利用一個@property就能夠同時生成setter/getter方法的聲明和實現
2 默認@property會將傳入的屬性賦值給_開頭的成員變量
3 若是利用@property來生成getter/setter方法, 那麼咱們能夠不寫成員變量, 系統會自動給咱們生成一個_開頭的成員變量
注意: @property自動幫咱們生成的成員變量是一個私有的成員變量, 也就是說是在.m文件中生成的, 而不是在.h文件中生成的
4 @property有一個弊端: 它只會生成最簡單的getter/setter方法的聲明和實現, 並不會對傳入的數據進行過濾, 若是想對傳入的數據進行過濾, 那麼咱們就必須重寫getter/setter方法
若是重寫了setter方法, 那麼property就只會生成getter方法
若是重寫了getter方法, 那麼property就只會生成setter方法
若是同時重寫了getter/setter方法, 那麼property就不會自動幫咱們生成私有的成員變量
#import <Foundation/Foundation.h> @interface Member : NSObject @property NSString * name; @property int age; @property NSString * account; @property NSString * password; @end #import "Member.h" @implementation Member @end