OC基礎--Property,oc--property
編譯器指令:
用來告訴編譯器要做什麼
@property:
@property是編譯器的指令 告訴編譯器在@interface中自動產生setter和getter的聲明
@synthesize:
@synthesize是編譯器的指令 告訴編譯器在@implementation中自動產生setter和getter的實現
手動寫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:
#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:
編譯器只要看到@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