1.分類用來(lái)添加方法,不能用來(lái)添加屬性(可以利用運(yùn)行時(shí)特性,動(dòng)態(tài)綁定屬性來(lái)實(shí)現(xiàn))
@proprety只會(huì)生成getter/setter方法的聲明, 不會(huì)生成實(shí)現(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.分類可以訪問(wèn)原來(lái)類中的成員變量
3.如果分類和原來(lái)類出現(xiàn)同名的方法, 優(yōu)先調(diào)用分類中的方法, 原來(lái)類中的方法會(huì)被忽略
@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.知識(shí)點(diǎn)補(bǔ)充,開(kāi)發(fā)中很少用到:多個(gè)分類中擁有同一個(gè)方法,使用時(shí),調(diào)用最后編譯的分類中的方法
- 假設(shè)一個(gè)Person類擁有三個(gè)分類,Person+funcOne、Person+funcTwo徘键、Person+funcThree,三個(gè)分類都有一個(gè)eat方法,執(zhí)行最后一個(gè)編譯的分類中的方法.
#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;
}
輸出:-[Person(funcTwo) eat]