1.介面部分:對外聲明類的行為和特征(類的定義分為:介面部分和實現部分) ① @interface 介面關鍵字:用於表示這是一個類的介面部分 介面部分功能:是定義類的靜態特征和聲明動態行為 @end 作為結束標誌 對外介面:通過介面就可以在不知道實現的情況下,瞭解這個類有什麼 Person:類名,每
1.介面部分:對外聲明類的行為和特征(類的定義分為:介面部分和實現部分) ① @interface 介面關鍵字:用於表示這是一個類的介面部分 介面部分功能:是定義類的靜態特征和聲明動態行為 @end 作為結束標誌 對外介面:通過介面就可以在不知道實現的情況下,瞭解這個類有什麼 Person:類名,每一個類都要起一個名字。首字母大寫(類:對象的類型) NSObject:父類 @interface Person: NSObject ②靜態特征:實例變數 ③實例變數必須在花括弧中 ④創建實例變數的時候不能被賦值 ⑤在創建實例變數的時候,實例變數錢加“_”:系統這樣寫;區分; { ⑤實例變數的可見度 《1》內部:類的實現部分使用實例變數 《2》外部:不在實現部分使用 《3》@public範圍:外部、內部、繼承 《4》@protected(系統預設)範圍:內部、繼承 《5》@private範圍:內部 //添加當前類屬性
@public//作用範圍是直到下一個結束或者實例變數結束 NSString *_name; NSInteger _age; @protected CGFloat _height; @private CGFloat _weight;
} //動態行為:方法(添加類的行為) - (void)sayHi; @end 2.實現部分:類行為的具體實現(方法的實現) ①@implementation:關鍵字,表示類的實現部分 Person:類名,表示實現的是哪個類 @end:類 結束實現標誌 @implementation Person - (void)sayHi{ NSLog(@“Hello World”);
} @end 3.使用類創建對象。Objective-C中創建的對象,全部放在堆區(對象:類的實例) int main(){ @autoreleasepool{ ①申請空間 保存空間地址 《1》記憶體分配 (alloc方法:用於分配記憶體空間) Person *p = [Person alloc]; 《2》對象初始化(init方法:用於初始化對象),將記憶體空間數據清零 p = [p init]; 《3》將創建對象的《1》和《2》合成一步 Person *p1 = [[Person alloc] init]; ②使用成員變數 p1->_age = 10; p1->_name = @“貝爺”; ③使用方法 [p1 sayHi];
} return 0;
} 4.類是對一類具有相同事物行為和特征事物的抽象 5.封裝、繼承、多態 ①封裝:將現實世界中存在的某個客體的屬性與行為綁定在一起,並放置在一個邏輯單元內 ②繼承:子類自動共用父類數據結構和方法的機制,這是類之間的一種關係 ③多態:指相同的操作或函數、過程可作用於多種類型的對象上並獲得不同的結果 6.@class的作用:只是表示有Girl這麼一個類型,其他的什麼都沒做。在什麼地方使用Girl這個類時,再導入Girl.h 註意:我們一般選擇在.h中使用@class,在.m中引入頭文件 7.組合類的使用:(指針存儲對象的首地址,代指對象。OC中使用指針代指對象,進行操作) ①Mother.h #import <Foundation/Foundation.h>
@interface Mother : NSObject
{
@public
NSString *_name;
} @end ②Father.h #import <Foundation/Foundation.h>
@interface Father : NSObject
{
@public
NSString *_name;
}
@end ③Child.h #import <Foundation/Foundation.h>
@interface Child : NSObject
{
@public
NSString *_name;
} @end ④Family.h #import <Foundation/Foundation.h> #class Father; #class Mother; #class Child;
@interface Family : NSObject
{
@public
Father *_f;
Mother *_m;
Child *_c;
}
@end ⑤main.m Father *father = [[Father alloc]init];
father->_name = @"父親";
Mother *mother = [[Mother alloc] init];
mother->_name = @"母親";
Child *child = [[Child alloc] init];
child->_name = @"孩子";
Family *family = [[Family alloc] init];
family->_f = father;
family->_m = mother;
family->_c = child; NSLog(@"%@ %@ %@ ",family->_f->_name,family->_m->_name,family->_c->_name); 8.列印字元串用“%@”做占位符。用”[]”調用方法 有列印,沒有控制台輸入 9. ①面向過程:編程以事件(任務)為中心,程式圍繞事件,列出了事件的每個步驟,一步一步完成(側重點:實現功能 C) ②面向對象:編程以事物為中心,程式圍繞事物展開,完成事件只是一個小任務(側重點:對象的特征 OC,C++,java) 10.Objective-C中的幾種方法 ①“-”實例方法:由類的實例來執行。換言之,在調用實例方法之前,必須先創建該類的實例。實例方法是最常見的方法類型(方法只能對象使用) 示例:- (instancetype)init; // 有參(1個參)無返回值
// 冒號屬於方法名的一部分
// 方法名:printNum:
- (void)printNum:(NSInteger)num;
// 有兩個參數
// 方法名:printName:age:
- (void)printName:(NSString *)name age:(NSInteger)age;
//有三個參數
//方法名:printName:age:score: - (void)printName:(NSString *)name age:(NSInteger)age score:(CGFloat)score; ②“+”類方法:可由它所在的類直接執行。它不需要對象的實例作為消息的接收者(方法只能被類使用) 示例:+ (instancetype)alloc; 註:類方法中不能使用實例變數 11.instancetype和id區別 ①instancetype可以返回和方法所在類相同類型的對象,id只能返回未知類型對象。 ②instancetype只能作為返回值和參數,id還可以用來定義變數 ③instancetype會告訴編譯器當前的類型,但id對編譯器卻是無類型的,調用任何方法不會給出錯誤提示 ④對於init方法,id和instancetype是沒有區別的。因為編譯器會把id優化成instancetype。當明確返回的類型就是當前class時,使用instancetype能避免id帶來的編譯不出錯誤的情況。 12.如何獲取方法名 ①刪除:類型標識,返回類型,參數類型,參數名,空格。 示例:replaceObjectAtIndex:withObject 註意:類中不能出現同名方法;“:”標識參數,不能省略。有冒號必須有參數;冒號屬於方法名的一部分。 13.在OC中使用消息發送機制:[receiver message] 表述:①給receiver對象發送message消息②receiver接收到消息,即方法getSalary③receiver找到message方法,並執行 14.setter和getter方法 ①在OC中,為單一實例變數賦值的方法稱作setter(設置器) ②獲取單一實例變數值得方法稱作getter(訪問器) 15.setter和getter方法的書寫格式 給實例變數:NSInteger _age; ①setter的書寫格式:- (void)setAge:(NSInteger)age; 即set+首字母大寫的實例變數名(忽略下劃線) ②getter的書寫格式:- (NSInteger)age; j即返回值類型與變數類型一致,方法名與實例變數名相同(忽略下劃線) 16.setter和getter與實例變數的關係 ①無論setter還是getter內部操作的是實例變數 ②每一個實例變數都需要一對setter和getter方法 17.setter和getter的實際操作 ①Person.h #import <Foundation/Foundation.h>
//類的介面部分
/*
1.定義一個類
2.添加當前類屬性(特征)
3.添加當前類行為(方法)
*/
@interface Person : NSObject
{
//大括弧內部,添加當前類屬性
//字元串類型
NSString *name;//姓名,NSString同樣是一個類
//整型
NSInteger age;//年齡,NSInteger是數值類型,不是一種類
//字元串類型
NSString *gender;//性別
}
//初始化方法
//希望通過初始化方法,能夠獲得一個Person類的實例對象,並且希望該對象具有自己的姓名屬性
- (id)initWithName:(NSString *)_name;
//大括弧外部,添加當前類行為
- (void)sayHi;
//設置器 setter
- (void)setName:(NSString *)_name;
- (void)setAge:(NSInteger)_age;
- (void)setGender:(NSString *)_gender;
//訪問器 getter
- (NSString *)getName;
- (NSInteger)getAge;
- (NSString *)getGender;
@end ②Person.m #import "Person.h"
@implementation Person
- (id)initWithName:(NSString *)_name{
//1.原始初始化,也就是將記憶體內的變數置零
self = [super init];//將init方法發送給super對象
//2.原始初始化成功之後,需要設置當前對象的姓名為形參
if (self != nil) {
name = _name;
}
//3.返回當前對象
return self;
}
//大括弧外部,添加當前類行為
- (void)sayHi{
//NSLog將字元串列印在控制台進行輸出,類似於printf();
NSLog(@"hello world");
}
//設置器 setter
- (void)setName:(NSString *)_name{
//設置給當前對象的屬性
name = _name;
}
- (void)setAge:(NSInteger)_age{
age = _age;
}
- (void)setGender:(NSString *)_gender{
gender = _gender;
}
//訪問器 getter
- (NSString *)getName{
//訪問當前對象的屬性
return name;
}
- (NSInteger)getAge{
return age;
}
- (NSString *)getGender{
return gender;
} @end ③main.m #import <Foundation/Foundation.h>
#import "Person.h"//引入類名字