Category分類注意事項

1.分類用來添加方法,不能用來添加屬性(可以利用運行時特性,動態(tài)綁定屬性來實現(xiàn))

@proprety只會生成getter/setter方法的聲明, 不會生成實現(xiàn)和私有成員變量.

@interface NSObject (func)
@property (strong,nonatomic)NSString *vcName;

@end


#import "NSObject+func.h"
#import <objc/message.h>
@implementation NSObject (func)
-(void)setVcName:(NSString *)vcName{
    objc_setAssociatedObject(self, @"vcName", vcName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSString *)vcName{
    return objc_getAssociatedObject(self, @"vcName");
}
@end

ViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
    self.vcName = @"aaa";
    NSLog(@"%@",self.vcName);
}

輸出:aaa

2.分類可以訪問原來類中的成員變量

3.如果分類和原來類出現(xiàn)同名的方法, 優(yōu)先調(diào)用分類中的方法, 原來類中的方法會被忽略

@implementation Person

- (void)sleep
{
    NSLog(@"%s", __func__);
}
@end

@implementation Person (SJ)
- (void)sleep
{
    NSLog(@"%s", __func__);
}
@end

int main(int argc, const char * argv[]) {
    Person *p = [[Person alloc] init];
    [p sleep];
    return 0;
}

輸出結(jié)果:
-[Person(SJ) sleep]

4.知識點補充,開發(fā)中很少用到:多個分類中擁有同一個方法,使用時,調(diào)用最后編譯的分類中的方法

  • 假設一個Person類擁有三個分類,Person+funcOne、Person+funcTwo、Person+funcThree,三個分類都有一個eat方法,執(zhí)行最后一個編譯的分類中的方法.
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Person+funcOne.h"
#import "Person+funcTwo.h"
#import "Person+funcThree.h"
int main(int argc, const char * argv[]) {
    
    Person *p = [[Person alloc]init];
    
    [p eat];
    return 0;
}
image.png
輸出:-[Person(funcTwo) eat]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容