黑馬程式設計師 oc 特有語法2

2021-06-27 18:21:15 字數 4158 閱讀 8038

一、分類-category

1.基本用途

person.h檔案

@inte***ce person : nsobject

int _age;

@property int age;

- (void)test;

@end

person+jj.h檔案

#import "person.h"

@inte***ce person (jj)

- (void)test2;

@end

person+jj.m檔案

#import "person+jj.h"

@implementation person (jj)

- (void)test2

nslog(@"-----test2");

- (void)test

nslog(@"person (jj)-test");

@end

2.注意

category可以訪問原始類的例項變數,但不能新增變數,只能新增方法。如果想新增變數,可以考慮通過繼承建立子類

category可以實現原始類的方法,但不推薦這麼做,因為它是直接替換掉原來的方法,這麼做的後果是再也不能訪問原來的方法

多個category中如果實現了相同的方法,只有最後乙個參與編譯的才會有效

二、類的本質

其實類也是乙個物件,是class型別的物件,簡稱「類物件」

class型別的定義

typedef struct objc_class *class;

類名就代表著類物件,每個類只有乙個類物件

+load和+initialize

+load

在程式啟動的時候會載入所有的類和分類,並呼叫所有類和分類的+load方法

先載入父類,再載入子類;也就是先呼叫父類的+load,再呼叫子類的+load

先載入元原始類,再載入分類

不管程式執行過程有沒有用到這個類,都會呼叫+load載入

+initialize

在第一次使用某個類時(比如建立物件等),就會呼叫一次+initialize方法

乙個類只會呼叫一次+initialize方法,先呼叫父類的,再呼叫子類的

例:person.h檔案

#import 

@inte***ce person : nsobject

@property int age;

+ (void)test;

@end

person.m檔案

#import "person.h"

@implementation person

+ (void)test

nslog(@"呼叫了test方法");

// 當程式啟動的時候,就會載入一次專案中所有的類。類載入完畢後就會呼叫+load方法

+ (void)load

nslog(@"person---load");

// 當第一次使用這個類的時候,就會呼叫一次+initialize方法

+ (void)initialize

nslog(@"person-initialize");

@end

獲取類物件的2種方式

class c = [person class]; // 類方法

或者person *p = [person new];

class c2 = [p class]; // 物件方法

類物件呼叫類方法

class c = [person class];

person *p2 = [c new];

三、description方法

1.-description方法

使用nslog和%@輸出某個物件時,會呼叫物件的-description方法,並拿到返回值進行輸出

2.+ description方法

使用nslog和%@輸出某個類物件時,會呼叫類物件+description方法,並拿到返回值進行輸出

修改nslog的預設輸出

重寫-description或者+description方法即可

例:person.h檔案

#import "person.h"

@implementation person

+ (void)test

nslog(@"呼叫了test方法");

// 當程式啟動的時候,就會載入一次專案中所有的類。類載入完畢後就會呼叫+load方法

+ (void)load

nslog(@"person---load");

// 當第一次使用這個類的時候,就會呼叫一次+initialize方法

+ (void)initialize

nslog(@"person-initialize");

@end

person.m檔案

#import "person.h"

@implementation person

// 決定了例項物件的輸出結果

//- (nsstring *)description

//    // 下面**會引發死迴圈

//    // nslog(@"%@", self);

//    return [nsstring stringwithformat:@"age=%d, name=%@", _age, _name];

//    //return @"3424324";

// 決定了類物件的輸出結果

+ (nsstring *)description

return @"abc";

@end

main.m檔案

#import 

#import "person.h"

void test9()

// 輸出當前函式名

nslog(@"%s\n", __func__);

int main()

// 輸出行號

nslog(@"%d", __line__);

// nslog輸出c語言字串的時候,不能有中文

// nslog(@"%s", __file__);

// 輸出原始檔的名稱

printf("%s\n", __file__);

test9();

person *p = [[person alloc] init];

// 指標變數的位址

nslog(@"%p", &p);

// 物件的位址

nslog(@"%p", p);

nslog(@"%@", p);

return 0;

四、sel

1.方法的儲存位置

每個類的方法列表都儲存在類物件中

每個方法都有乙個與之對應的sel型別的物件

根據乙個sel物件就可以找到方法的位址,進而呼叫方法

sel型別的定義

typedef struct objc_selector  *sel;

2.sel物件的建立

sel s = @selector(test);

sel s2 = nsselectorfromstring(@"test");

3.sel物件的其他用法

// 將sel物件轉為nsstring物件

nsstring *str = nsstringfromselector(@selector(test));

person *p = [person new];

// 呼叫物件p的test方法

[p performselector:@selector(test)];

4.nslog輸出增強

__file__ :源**檔名

__line__ :nslog**在第幾行

_cmd :代表著當前方法的sel

// 下面的**會引發死迴圈

- (void)test {

[self performselector:_cmd];

黑馬程式設計師 oc的特有語法

l 設計兩個類bird dog bird 的宣告 inte ce bird nsobject void eat end bird 的定義 implementation bird void eat end dog 的宣告 inte ce dog nsobject void eat end dog 的定...

黑馬程式設計師 OC語言 4 OC特有語法

若排版有錯誤,請檢視 點語法 本質是方法呼叫。p.age 10 p setage 10 int a p.age p age void setage int age int age 3.返回乙個已經初始化完畢的物件 return self 可將1 2步合併 id init return self 1....

黑馬程式設計師 OC基本語法

oc是c系列語言,是物件導向的語言,而c語言是面向過程的,那麼首先要理解物件導向和面向過程的區別。面向過程是專注 事件 本身,這件事從發生到結束的行為。例如怎麼把大象裝進冰箱,面向過程的思想是這樣的,首先開啟冰箱門,把大象裝進去,然後把冰箱門關上。而物件導向是專注於 事物 本身的,同樣是裝大象,物件...