2、實例變量可⻅度與方法

實例變量可⻅度

可見度 特點
public(公有的) 實例變量可以在類的外部和內部操作
protected(受保護的,默認的) 實例變量只能在該類和其⼦類內操作
private(私有的) 實例對象只能在該類內訪問

注:所謂的內部,指的是相應類的@implementation 和@end之間

// .h文件中
@interface Person : NSObject 
{ 
     @public 
     NSString *_hobby; //興趣
     @protected 
     NSString *_name; //姓名
     int _age; //年齡
     @private 
     NSString *_sex; //性別
}

// main函數文件中

//@public
Person * p = [[Person alloc] init];
p -> _hobby = @“聽⾳樂、看電影”;
NSLog(@"⼈的興趣:%@",p -> _hobby);

//@protected

protected的使用

//@private

private的使用

注意事項:

  1. 爲什麼不使⽤@public?
    • 使⽤@public關鍵字,暴露了類內部的細節
    • 不符合⾯向對象語⾔的三⼤特性之⼀——封裝
  2. 如何在其他⽂件中訪問對象@protected修飾的實例變量?
    • 提⽰:添加兩個⽅法
    • 賦值:通過⽅法傳⼊參數,在類的內部實現實例變量賦值
    • 取值:通過⽅法獲取實例變量的值

⽅法

無參方法聲明實現及調用

對象方法

  • 對象方法以-開頭如 -(void)xx;
  • 對象方法只能由對象來調用
  • 對象方法中可以訪問當前對象的成員變量
  • 調用格式 [對象名 對象方法名];

類方法

  • 類方法以+開頭 如+(void)put;
  • 類方法只能由類來調用
  • 類方法中不能訪問實例(成員)變量,因爲類方法由類來調用,並沒有創建存儲空間來存儲類中的成員變量
  • 調用格式:[類名 類方法名];
  • 類方法的好處和適用場合:
    • 不依賴於對象,執行效率更高;
    • 能用類方法解決的問題,儘量使用類方法;
    • 場合:當方法內部不需要使用到成員變量時,可以改爲類方法。

聲明

//方法類型  返回值類型  方法名
      -    (double)    pi;

調用

使用對象調用方法就是OC中的消息機制
oc語言中採用特定的語言調用類或者實例(對象)的方法稱爲發送消息或方法調用。

//格式:[類名或者對象名 方法名];
Person * p = [[Person alloc] init];
[p eat];

有參有返回值

有參有返回值方法聲明

方法名

  • 刪除:類型標識,返回類型,參數類型,參數名,空格。例如:

    replaceObjectAtIndex:withObject:

  • 類中不能出現同名⽅法。

  • “ : ” 標識參數,不能省略。有冒號必須有參數。

初始化、賦值、取值⽅法(init、setter、getter)

初始化

//.h 文件
//聲明屬性
@interface AoDiCar : NSObject
{
    NSString *_color;
    int _lunzi;
    NSString *_pinpai;
}
//init
-(id)initWithColor:(NSString *)color
               lunzi:(int)lunzi
              pinpai:(NSString *)pinpai;

//.m 文件
//init
-(id)initWithColor:(NSString *)color
               lunzi:(int)lunzi
              pinpai:(NSString *)pinpai{
    _color = color;
    _lunzi = lunzi;
    _pinpai = pinpai;
    return self;
}

單個參數

//.h 文件
//賦值
- (void)setName:(NSString *)name;
//取值
- (NSString *)getName;

//.m 文件
//賦值
- (void)setName:(NSString *)name{
    _name = name;
}
//取值
- (NSString *)getName{
    return _name;
}

多個參數

//.h 文件
//setter
-(void)setColor:(NSString *)color
          lunzi:(int)lunzi//注意,這裏沒有分號
         pinpai:(NSString *)pinpai;//這裏纔有分號

//getter
-(NSString *)color;
-(int)lunzi;
-(NSString *)pinpai;

//.m 文件
//setter
-(void)setColor:(NSString *)color
          lunzi:(int)lunzi
         pinpai:(NSString *)pinpai{
    _color = color;
    _lunzi = lunzi;
    _pinpai = pinpai;
}

//getter
-(NSString *)color{
    return _color;
}
-(int)lunzi{
    return _lunzi;
}
-(NSString *)pinpai{
    return _pinpai;
}

調用

//main函數
AoDiCar *car1 = [[AoDiCar alloc] initWithColor:@"黑色" lunzi:4 pinpai:@"不造"];//初始化
NSLog(@"%@奧迪有%d個輪子,品牌%@",[car1 color],[car1 lunzi],[car1 pinpai]);//輸出初始化的數據

[car1 setColor:@"紅色" lunzi:4 pinpai:@"不造"];//用setter賦值
NSLog(@"%@奧迪有%d個輪子,品牌%@",[car1 color],[car1 lunzi],[car1 pinpai]);//用getter取值

@class

用於引入類,但並不引入類的屬性

IOS基礎:深入理解Objective-c中@class的含義
objective-c中,當一個類使用到另一個類時,並且在類的頭文件中需要創建被引用的指針時,有兩種辦法:
一種是通過#import方式引入;另一種是通過@class引入;

#import "B.h"//引入類,同時引入類屬性
@class B;//僅引入類
@interface A : NSObject {   
    //A類是引用類,B類是被引用類  
    B *b;   
}   
@end

### instancetype和id的區別

  • instancetype在類型表示上,跟id一樣,可以表示任何對象類型;
  • instancetype只能用在返回值類型上,不能像id一樣用在參數類型上;
  • instancetype比id多一個好處:編譯器會檢測instancetype的真實類型;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章