第一种:runtime.h里的方法BOOL class_addProperty(Class cls, const char *name,
const objc_property_attribute_t *attributes, unsigned int attributeCount)
#include <objc/runtime.h>
#import <Foundation/Foundation.h>
@interface SomeClass : NSObject {
NSString *_privateName;}@end@implementation SomeClass- (id)init
{
self = [super init];
if (self) _privateName = @"Steve";
return self;}@endNSString *nameGetter(id self, SEL _cmd)
{
Ivar ivar = class_getInstanceVariable([SomeClass class], "_privateName");
return object_getIvar(self, ivar);}
void nameSetter(id self, SEL _cmd, NSString *newName)
{
Ivar ivar = class_getInstanceVariable([SomeClass class], "_privateName");
id oldName = object_getIvar(self, ivar);
if (oldName != newName) object_setIvar(self, ivar, [newName copy]);}int main(void)
{
@autoreleasepool { objc_property_attribute_t type = { "T", "@/"NSString/"" };
objc_property_attribute_t ownership = { "C", "" }; // C = copy
objc_property_attribute_t backingivar = { "V", "_privateName" };
objc_property_attribute_t attrs[] = { type, ownership, backingivar };
class_addProperty([SomeClass class], "name", attrs, 3);
class_addMethod([SomeClass class], @selector(name), (IMP)nameGetter, "@@:");
class_addMethod([SomeClass class], @selector(setName:), (IMP)nameSetter, "v@:@");
id o = [SomeClass new];
NSLog(@"%@", [o name]);
[o setName:@"Jobs"];
NSLog(@"%@", [o name]);
}}输出:SteveJobs
第二种:- (id)valueForUndefinedKey:(NSString *)key
第三种:static char const * const ObjectTagKey;@implementation NSObject
(ExampleCategoryWithProperty)@dynamic objectTag;- (id)objectTag
{
return objc_getAssociatedObject(self, ObjectTagKey);
}
- (void)setObjectTag:(id)newObjectTag
{
objc_setAssociatedObject(self,
ObjectTagKey, newObject,
OBJC_ASSOCIATION_RETAIN_NONATOMIC);}
更多信息请查看IT技术专栏