OC基礎--Property,oc--property

來源:互聯網
上載者:User

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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.