OC第二課,OC
主要內容:執行個體變數可見度、方法
一、執行個體變數可見度
public(共有的):執行個體變數可以在類的內部和外部使用
protected(受保護的、預設的):執行個體變數只能在該類及其子類中使用
private(私人的):執行個體對象只能在該類中使用
所謂的內部是指:@interface .... @end之間
樣本:
@interface
@public / /共有的,誰都能訪問
NSString *_adress ; / /地址
NSString *_hobby ; / /愛好
@protected / /受保護的、預設的,只能在該類及其子類中使用
NSString *_name ; / /姓名
NSString *_age ; / /年齡
@private / /私人的只能在該類內部使用
NSString *_gender ; / /性別
@end
一般情況下,使用預設的受保護的 @protected
為什麼呢?因為使用@public關鍵字暴漏了類內部的組件,違背了物件導向的 “ 封裝 ” 特性
下面是使用@public、@protected、@private的區別
如何在其他檔案中使用protected修飾的執行個體變數呢?
二、方法
OC中有兩種方法:
類方法:只能類使用,例如 +(id)alloc
注意:類方法中不能使用執行個體變數
執行個體方法:只能對象使用,例如:-(void)sayHi
方法名就是:去掉方法類型、返回值類型、參數類型、參數名和空格,剩下的就是方法名
例如:replaceObjectAtindex :withObject:這就是一個方法名
注意:1、類中不能出現相同的方法名
2、" : "標示參數,不能省略,有 " : "必須有參數
賦值、取值方法
樣本:
- (void)setName:(NSString *)name;
- (NSString *)getName;
- (void)setName:(NSString *)name
{
_name = name;
}
- (NSString *)getName
{
return _name;
}
不過我們一般寫成這種方式(多參方式:簡介、省事)
樣本:
- (void)setName:(NSString *)name
setAge:(int)age
setHeight:(float)height ;
- (NSString *)getName
{
return _name;
}
- (int)getAge
{
return _age;
}
- (float)getHeight
{
return _height;
}
注意:1、OC裡面,為執行個體變數賦值的方法稱為setter(設定器)
2、讀取執行個體變數值的方法稱作getter(訪問器)
3、setter方法可以把參數寫在一起(多參),但是擷取方法getter必須分開寫,一個參數一個getter方法
4、無論是setter還是getter內部操作的是執行個體變數,每一個執行個體變數都需要一對setter和getter方法
方法的使用:
在OC裡面沒有 “ student調用sayHi ” 這種表述
正確表述:給student對象發送sayHi訊息,格式: [ student sayHi ]
三、自訂初始化方法
- (id)init這個初始化方法只能給執行個體變數設定預設值,不靈活
- (instancetype)initWithName:自訂初始化方法,根據需求定義初始化的方法
樣本:
- (instancetype)initWithName:(NSString *)name
initWithAge:(int)age
initWithHeight:(float)height ;
- (instancetype)initWithName:(NSString *)name
initWithAge:(int)age
initWithHeight:(float)height
{
_name = name;
_age = age;
_height = height;
return self;
}
#import:匯入標頭檔,即匯入標頭檔中的內容到當前類
#import " " :匯入自訂的類
#import <>:匯入系統類別庫中的標頭檔
功能類似C語言的#include,但是可以避免標頭檔的重複匯入
四、嵌套迴圈匯入
建立兩個類,A繼承於NSObject,B繼承於NSObject
A類有個執行個體變數 B *b;
B類有個執行個體變數 A *a;
這時就需要用到@class關鍵字
@class:告訴編譯器@class後面的字串作為類名使用,並未匯入類的介面內容,有效避免了嵌套迴圈匯入