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]