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

2021-06-25 07:31:26 字數 3833 閱讀 1205

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

的定義@implementation dog

- (void)eat

@end

l   有相同的屬性和行為,抽出乙個父類animal(先抽取weight屬性,再抽取eat方法)

// animal

的宣告@inte***ce animal : nsobject

- (void)eat;

@end

// animal

的定義@implementationanimal

- (void)eat

@end

l   子類在父類的基礎上拓充屬性和方法

// bird

的宣告@inte***cebird : animal

- (void)fly;

@end

// bird

的定義@implementationbird

- (void)fly

@end

// dog

的宣告@inte***ce dog: animal

- (void)run;

@end

// dog

的定義@implementation dog

- (void)run

@end

l   子類方法和屬性的訪問過程:如果子類沒有,就去訪問父類的

l   父類被繼承了還是能照常使用的

l   父類的靜態方法

l   畫繼承結構圖,從子類抽取到父類

l   nsobject的引出:全部oc類的最終父類,包含了一些常用方法,比如+new

l   父類\超類  superclass

l   子類  subclass\subclasses

l   單繼承

l   子類和父類不能有相同的成員變數

l   方法的重寫

l   分別呼叫父類的物件方法和類方法

l   不改變原來模型的基礎上,拓充方法

l   建立了類與類之間的聯絡

l   抽取了公共**

l   壞處:耦合性強

l   它的所有屬性都是你想要的,一般就繼承

l   它的部分屬性是你想要的,可以抽取出另乙個父類

l   某一類事物的多種形態

l   oc物件具有多型性

person *p = [student new];

p->age = 100;

[p walk];

l  子類物件賦值給父類指標

l  父類指標訪問對應的屬性和方法

l   用父類接收引數,節省**

l   不能訪問子類的屬性(可以考慮強制轉換)

l   動態繫結:在執行時根據物件的型別確定動態呼叫的方法

nsstirng *str = @「hello」;

nsstring *name = @」mj」;

nslog(@「我的名字是%@」,  name);

ø   如何在不改變原來類模型的前提下,給類擴充一些方法?有2種方式

l   繼承

l   分類(category)

ø   分類的宣告

@inte***ce 類名 (分類名稱)

// 方法宣告

@end

ø   分類的實現

@implementation 類名 (分類名稱)

// 方法實現

@end

ø   乙個龐大的類可以分模組開發

ø   乙個龐大的類可以由多個人來編寫,更有利於團隊合作

ø   給nsstring增加乙個類方法:計算某個字串中阿拉伯數字的個數

ø   給nsstring增加乙個物件方法:計算當前字串中阿拉伯數字的個數

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

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

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

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

ø   class型別的定義

typedef

struct

objc_class *class;

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

ø   +load

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

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

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

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

ø   +initialize

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

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

class c = [person

class]; //

類方法

或者person *p = [person

new];

class c2 = [p class]; //

物件方法

class c = [person

class];

person *p2 = [c new];

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

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

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

l   如果在-description方法中使用nslog列印self

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

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

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

ø   sel型別的定義

typedef

struct

objc_selector       *sel;

sel s = @selector(test);

sel s2 = nsselectorfromstring(@"test");

// 將

sel物件轉為

nsstring物件

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

person *p= [person

new];

//呼叫物件p的

test方法

[p performselector:@selector(test)];

ø   __file__ :源**檔名

ø   __line__ :nslog**在第幾行

ø   _cmd :代表著當前方法的sel

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

- (void)test {

[self

performselector:_cmd];

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

一 分類 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 te...

黑馬程式設計師 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語言是面向過程的,那麼首先要理解物件導向和面向過程的區別。面向過程是專注 事件 本身,這件事從發生到結束的行為。例如怎麼把大象裝進冰箱,面向過程的思想是這樣的,首先開啟冰箱門,把大象裝進去,然後把冰箱門關上。而物件導向是專注於 事物 本身的,同樣是裝大象,物件...