實例變量可⻅度
可見度 | 特點 |
---|---|
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
//@private
注意事項:
- 爲什麼不使⽤@public?
- 使⽤@public關鍵字,暴露了類內部的細節
- 不符合⾯向對象語⾔的三⼤特性之⼀——封裝
- 如何在其他⽂件中訪問對象@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的真實類型;