一、類和對象,,類對象
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; @end2.實現部分:類行為的具體實現(方法的實現)①@implementation:關鍵字,表示類的實現部分 Person:類名,表示實現的是哪個類 @end:類 結束實現標誌@implementation Person - (void)sayHi{ NSLog(@“Hello World”);
} @end3.使用類建立對象。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"//引入類名字int main(int argc, const char * argv[]) { //1.建立Person類的執行個體對象
Person *person = [[Person alloc] initWithName:@"Lewis"];//用【】調用方法
//2.給person發送執行個體訊息sayHi
[person sayHi];
//修改name,添加設定器(setter)與訪問器(getter)
/*
類名 屬性名稱 設定器方法名 訪問器方法名
Person name -setName: -getName
*/
//3.先列印當前person執行個體對象的姓名是什麼
NSLog(@"person's name is %@",[person getName]);
//4.修改當前person執行個體對象的姓名,修改成jack
[person setName:@"Jack"];
NSLog(@"person's name is %@",[person getName]);
}18.點文法(只對getter setter有效)s.name = @"小白";NSLog(@"%@",s.name); [s setAge:12];NSLog(@"%ld",[s age]);s.score = 99.99;NSLog(@"%.2f",s.score);