您好,登錄后才能下訂單哦!
接口與實現的分離
Objective-C定義一個類,分成兩部分:接口、實現
接口(公開):聲明類中的成員變量、屬性、方法。
實現(隱藏):實現類中的方法。
接口與實現分離的好處:
想要使用這個類時只需知道接口部分即可。
同時將實現部分隱藏起來,有利于代碼的封裝
例如:實現一個汽車類,只需要知道如何開車,而不需要汽車如何工作的
定義類的接口部分
關鍵字:@interface @end
@interface className : parentClassName
{
//成員變量
}
//方法的聲明以及屬性的聲明
@end
成員變量的訪問權限:
@public 作用域不受限制 //如
@protected 作用域被限定在類和子類中
@private 作用域被限定在類中
@package 作用域被限定在整個框架中
默認是@protected
方法的聲明方式:
- (type) methodName;
示例代碼:
//接口部分:屬性、方法的聲明 @interface AMStudent : NSObject {//編程規范:屬性名以_開頭,多個單詞,除第一個單詞意外的單詞首字母大寫 NSInteger _id; NSString *_name;//OC對象必須用指針存儲地址 NSInteger _age; NSInteger _score; } /** 顯示學生信息 */ - (void) showInfo; @end
/** */ 是Xcode特有的注釋方式
在Xcode環境中,調用該方法的自動補齊提示處,提示注釋內容
小伙伴們可以試一試
定義類的實現部分
關鍵字:@implementation @end
@implementation class_name
{
//私有成員變量
}
//方法的實現
@end
可以在實現部分定義成員變量,但不鼓勵這么去做
權限一定是private;不能和接口部分的成員變量重復
方法的實現和實現函數類似
示例代碼:
//實現部分:方法的定義 @implementation AMStudent - (void)showInfo { NSLog(@"[id:%ld][name:%@][age:%ld][score:%ld]", self->_id, self->_name, self->_age, self->_score); } @end
其他注意:
@interface...@end以及@implementation...@end不能嵌套
接口部分聲明的方法,在實現部分必須要給出實現
實現部分的方法如果在接口部分沒有聲明接口,則成為一個內部方法不對外公開
實例化對象
實例化一個對象,是按照定義的類創造出一個實體對象,如根據汽車的圖紙(類)造出汽車(對象)。
最簡單的方法是:
className * objName = [className new];
Objective-C的對象,必須使用指針存儲地址,不能創建局部對象和全局對象
[]運算符的含義是: 向對象發送一個消息,對象收到消息后會調用對應的方法。
new這個消息的含義是: 創建一個對象(分配空間、成員變量初值為0)
示例代碼:
AMStudent *ps = [AMStudent new];
在OC中類其實也是一種對象
所以new這個消息是發送給類這種對象的
對應方法我們稱之為類方法,和對象方法是不同的
對象方法
要和函數區分:
函數可直接調用,方法需要通過[]發送消息
方法內可以直接使用類(對象)中的成員變量
沒有參數的方法:
接口聲明: - (returnValueType) methodName;
方法調用: [objName methodName]
- (void) showInfo; - (AMStudentScoreLevel) getScoreLevel; //AMStudentScoreLevel是枚舉類型
一個參數的方法:
接口聲明: - (returnValueType) methodName: (parType) parName;
方法調用: [objName methodName:argName];
/** 設置學生的ID */ - (void) setId:(NSInteger) ID;
多個參數的方法:
接口聲明:
- (returnValueType) methodName1: (par1Type) par1Name
methodName2:(par2Type) par2Name ...;
方法調用:
[objName methodName1:argName methodName2:arg2Name ...];
蘋果公司鼓勵工程師使用這種句子一樣寫法 ,即代碼本身具有注釋的部分功能
/** 設置學生信息 */ - (void) setInfoWithId:(NSInteger) identifier andWithName:(NSString*) name andWithAge:(NSInteger) age andWithScore:(NSInteger) score;
方法中的self關鍵字:
是一個指針,指向當前對象,即調用這個方法的對象
注意:self指針的指向不能變化
用途:
成員變量(屬性)與參數名的區分
獲得當前對象的地址(如作為返回值)
調用對象的其他方法
- (void)showInfo { NSLog(@"[id:%ld][name:%@][age:%ld][score:%ld]", self->_id, self->_name, self->_age, self->_score); }
description方法:
任何一個類都可以實現這個方法(無需聲明),該方法是由父類NSObject繼承而來的
該方法返回一個OC對象類型NSString
在NSLog()函數打印時,指定%@,將自動調用該方法并打印返回的字符串。
- (NSString *)description {//重寫的NSObject的方法,%@輸出的就是返回的字符串 NSString * p = [NSString stringWithFormat:@"AMStudent : [id:%ld][name:%@][age:%ld][score:%ld]", self->_id, self->_name, self->_age, self->_score]; return p; }
接口的源文件擴展
在類的源文件的@implementation之前添加一個接口的擴展,是聲明內部方法、成員變量、屬性的常見做法
在接口擴展中聲明的內容將不對外開放,僅允許在該類的源文件內部使用
語法:在@implementation前
@interface 類名 ()
...
@end
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。