一、首先類目(類別)Category
1.從定義看類目就是給類來添加一個眼睛👀,哈哈,其實就是添加方法,比如給一個類MyFirstViewController用類目的形式來添加一個方法,調用這個方法就會打印@“小馬哥真帥!”,本人添加類目用的是下面這種方式,如果直接在給需要添加類目的類中的.m文件中也是可以的,但是這樣的話用着個人感覺不習慣,好了閒話少說下面進入正題:
之後就有會形成 "MyFirstViewController+Category.h"和"MyFirstViewController+Category.m"的一個類這時我們在類裏面添加方法:
.h文件中:
#import "MyFirstViewController.h" @interface MyFirstViewController (Category) - (NSString *)myName:(NSString *)string;
@end
.m文件中實現:
#import "MyFirstViewController+Category.h" @implementation MyFirstViewController (Category) - (NSString *)myName:(NSString *)string{ return @"小馬哥最帥!"; } @end
這就是生成了一個類目,調用十分簡單;[self myName:@""];就可以啦。是不是很簡單;
注:一般來說類目是不能添加屬性的,只能添加方法,不行你試試,直接崩潰了都;但是什麼都沒有一定的,給類目添加屬性也是可以的,但是需要用到兩個運行時的東東;objc_getAssociatedObject和objc_setAssociatedObject,其實添加的是屬性的set和get方法,並不是成員變量;
在類目的.m文件中:
static char strAddrKey = 'a'; - (NSString *)addr { return objc_getAssociatedObject(self, &strAddrKey); } - (void)setAddr:(NSString *)addr { objc_setAssociatedObject(self, &strAddrKey, addr, OBJC_ASSOCIATION_COPY_NONATOMIC); }
這樣就OK了,是不是很屌,其實用的真心不多;好了,類目的問題就到此結束!
二、延展(Extension)
首先延展既可以給類添加屬性,又可以給類添加方法,其實就是匿名的類目,但是可不一樣呦,其實我們創建控制器時.m文件中生成的接口就是:如下,
@interface ViewController (){
}
延展就沒有啥好說的了,就是相當於給類添加私有的屬性,成員變量,或者方法的;
三、代理協議(protocol)
代理我們項目中用的太多了,不想說了,很簡單;需要注意的是代理也可以添加屬性的;protocol 中使用 property 只會生成 setter 和 getter 方法聲明,我們使用屬性的目的,是希望遵守我協議的對象能實現該屬性;
本文完!