1.什麼是分類
>分類:可以在不改變原有類前提的情況下,拓展很多新方法,但是不能拓展新的成員變量。
如果想要擴展新的成員變量,可以考慮使用繼承。
2.分類的書寫形式
>1),分類頭文件:
@interface 原有類 (分類名稱)
// 方法聲明
@end
> 2),分類的實現文件:
@implementation 原有類 (分類名稱)
// 分類聲明中的方法的實現
@end
3.使用注意
分類使用注意:
1),在分類中不能訪問原始類primary中@private作用域的成員變量
2),如果分類實現了和原始類同名的方法,會覆蓋原始類的這個方法,是的原始類的這個方法無法被調用
3),如果多個分類都實現了和原始類同名的方法,那麼會優先調用分類的這個方法,而且是最後參加編譯的那個優先級更高。
(也就是:分類(最後參與編譯的優先)-->原始類-->原始類的父類)
所以,最好不好在分類中實現和原始類同名的方法
4.分類的好處
1), 可以將一個很大的項目分模塊進行開發,減小項目的復雜性。
2),很多的功能被分散到不同的類中,由團隊不同成員開發,增強團隊合作性。
5.相關的操作
1)在Xcode 6.3版本中可以用快捷鍵 command + N 選擇OS X下面的Objective-C File 建立相對應類的分類,進入項目中,不喜歡使用快捷鍵的可以按照File-->NEW-->File..來選擇相應的文件操作。
2)建立的分類的聲明和實現形如:
// 分類的聲明
#import "Father.h"
@interface Father (Work)
//{
// int age; // 分類不能擴充成員變量
//}
- (void)work;
//- (void)walk;
@end
// 分類的實現
#import "Father+Work.h"
@implementation Father (Work)//原始類+分類名字
- (void)work
{
// NSLog(@"名字是%@的father在工作", _name); // 在分類中不能直接訪問原有類中@private作用域的成員變量
NSLog(@"名字是%@的father在工作", self.name);
}
- (void)walk
{
NSLog(@"名字是%@的father+work在走路", self.name);
}
@end
1. 類也是個對象
> 其實類也是一個對象,是Class類型的對象,可以簡稱為“類對象”
在Xcode中按住command鍵鼠標放在class點進去會發現原來class真正的面貌:
#if !OBJC_TYPES_DEFINED
/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;
/// Represents an instance of a class.
struct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};
上述是Class類型的定義。
>類名就代表著類對象,每個類只有一個類對象。
>相關配圖

2.+load 和 +initialize
> +load
在程序啟動的時候會加載所有的類和分類,並調用所有類和分類的+load方法
先加載父類,再加載子類;也就是先調用父類的+load,再調用子類的+load
先加載元原始類,再加載分類
不管程序運行過程有沒有用到這個類,都會調用+load加載
> +initialize
在第一次使用某個類時(比如創建對象等),就會調用一次+initialize方法
一個類只會調用一次+initialize方法,先調用父類的,再調用子類的
定義了一個Animal類,並讓Cat繼承於Animal用於演示 +load 和 +initialize
#import "Animal.h"
@interface Cat : Animal
- (void)quickEat;
@end
@implementation Cat
+ (void)load
{
NSLog(@"Cat + load");
}
+ (void)initialize
{
NSLog(@"Cat + initialize");
}
- (void)quickEat
{
NSLog(@"cat - eat");
}
@end
// 輸出結果
2015-08-27 07:28:51.047 03類的本質和初始化[1918:162703] Cat + load
2015-08-27 07:28:51.047 03類的本質和初始化[1918:162703] Cat + initialize