category and extension(二)

Category And Extension(二)

add property to category


上一篇文章說不能加category添加屬性,最近作的一個項目恰好有這個需求,google了一下,其實category是有辦法添加屬性的-_-,並且還有多種方法,在這裏總結一下.web


1>.methods1

直接在category的.h中添加,這時xcode會有warning。xcode

Property 'test1' requires method 'test1' to be defined - use @dynamic or provide a method implementation in this categoryide

按照提示在.m文件在@dynamic關鍵字修改就OK了。dynamic在編譯時不會檢查setter/getter的實現,在運行時setter/getter會動態綁定,在須要setter/getter的class中本身實現就OK了。ui

#import <Foundation/Foundation.h>

@interface NSObject (AddProperty1)

@property(nonatomic,strong)NSString *test1;

@end

----------------------------------------------------------------------

#import "NSObject+AddProperty1.h"

@implementation NSObject (AddProperty1)

@dynamic test1;

@end

(在用這種方法添加proprety,使用setter/getter的class若是不implementation會crash的)this

2>.methods2

//只用在.h文件添加協議
#import <Foundation/Foundation.h>

@protocol NSObjectProtocol <NSObject>

@optional

@property(nonatomic,strong)NSString *test3;

@end

@interface NSObject (AddProperty3)<NSObjectProtocol>

@end

同上一種方法同樣,在使用setter/getter的class中要implementation,不然會crashgoogle

3>.methods3

#import <Foundation/Foundation.h>

@interface NSObject (AddProperty2)

@property(nonatomic,strong)NSString *test2;

@end

----------------------------------------------------------------------

#import "NSObject+AddProperty2.h"

#import <objc/runtime.h>

@implementation NSObject (AddProperty2)


-(NSString*)test2{

    return objc_getAssociatedObject(self, @selector(test2));
}

-(void)setTest2:(NSString *)test2{

    objc_setAssociatedObject(self, @selector(test2), test2, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}
@end

利用objctive-c的runtime特性。我的更偏好於第三種方法,改動最小,並且在不知道源碼的源碼的狀況下也能add propertyatom

附上Demo免得之後本身忘記了spa

CategoryAndExtension.zipscala

相關文章
相關標籤/搜索