iOS 類目(類別)、延展和代理詳解

一、首先類目(類別)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 方法聲明,我們使用屬性的目的,是希望遵守我協議的對象能實現該屬性;

本文完!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章