- 類別的作用
- 將類的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架中:相當(dāng)于文件瘦身(把類似作用的方法整理一塊)方便代碼管理
- 創(chuàng)建對(duì)私有方法的前向引用:如果其他類中的方法未實(shí)現(xiàn),在你訪問(wèn)其他類的私有方法時(shí)編譯器報(bào)錯(cuò)這時(shí)使用類別,在類別中聲明這些方法(不必提供方法實(shí)現(xiàn)),編譯器就不會(huì)再產(chǎn)生警告
- 向?qū)ο筇砑臃钦絽f(xié)議:創(chuàng)建一個(gè)NSObject的類別稱為 “創(chuàng)建一個(gè)非正式協(xié)議”,因?yàn)榭梢宰鳛槿魏晤惖奈袑?duì)象使用(當(dāng)類別所在類和引用該類別的類同時(shí)實(shí)現(xiàn)一個(gè)方法時(shí)優(yōu)先調(diào)用類別類的實(shí)現(xiàn)方法)
- 類別使用場(chǎng)景
- 類包含了很多個(gè)方法實(shí)現(xiàn),而這些方法需要不同團(tuán)隊(duì)的成員來(lái)實(shí)現(xiàn)
- 當(dāng)你在使用基礎(chǔ)類庫(kù)中的類時(shí),你不想繼承這些類而只想添加一些方法時(shí)。
- 調(diào)用其他類的私有方法
- 當(dāng)非正式協(xié)議使用
- 舉例說(shuō)明
#import "ClassName.h"
@interface ClassName ( CategoryName )
// method declarations
@end
- 類別添加自定義屬性
當(dāng)向類別中添加自定義屬性時(shí)會(huì)報(bào)instance variables may not be placed in categories錯(cuò)誤
@interface LMReadingVC (Helper)<UIToolbarDelegate>
{
NSString *topbar;/*報(bào)錯(cuò)instance variables may not be placed in categories */
}
正確添加方法
@interface NSObject (XY)
@property (nonatomic, strong) id tempObject;
@end
@implementation NSObject (XY)
@dynamic tempObject;
- (id)tempObject
- {
id object = objc_getAssociatedObject(self,NSObject_key_tempObject);
return object;
}
- (void)setTempObject:(id)tempObject
{
[self willChangeValueForKey:@"tempObject"];
objc_setAssociatedObject(self, NSObject_key_tempObject, tempObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[self didChangeValueForKey:@"tempObject"];
}
@end
Extension簡(jiǎn)要說(shuō)明
Extension非常像是沒(méi)有命名的類別。
@interface MyClass : NSObject
@property (retain, readonly) float value;
@end
//一般的時(shí)候,Extension都是放在.m文件中@implementation的上方。
@interface MyClass ()
@property (retain, readwrite) float value;
@end
使用Extension需要注意的點(diǎn):
(1) Extension中的方法必須在@implementation中實(shí)現(xiàn),否則編譯會(huì)報(bào)錯(cuò)。
偷懶引用網(wǎng)友例子說(shuō)明創(chuàng)建對(duì)私有方法的前向引用
/*********person.h***********/
#import <Foundation/Foundation.h>
@interface person : NSObject
+ (void)getAge;
@end
/*********person.m***********/
#import "person.h"
@interface person ()
+ (void)getName;
@end
@implementation person
+ (void)getAge {
NSLog(@"age:18");
}
+ (void)getName {
NSLog(@"name:XXX");
}
@end
然后正常情況下別的類想要直接調(diào)用getName是調(diào)用不了的,會(huì)報(bào)錯(cuò)
然后我又創(chuàng)建了一個(gè)Category,在.h里聲明方法getName,.m什么也沒(méi)寫
#import "person.h"
@interface person (TEXT)
+ (void)getName;
@end
然后在要調(diào)用的類import這個(gè)Category,再去運(yùn)行上圖的代碼,就不會(huì)報(bào)錯(cuò),而且getName的私有方法也執(zhí)行了