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