OC基礎--Property

編譯器指令: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
相關文章
相關標籤/搜索