马上就要回家过年了,身为伟大的程序员,过年怎么能不带个妹子回家呢,没有妹子的怎么办?
没关系,我们new一个贝
NSMutableDictionary *me = [NSMutableDictionary dictionary];
// 从 GirlEntity类 创建一个妹子
GirlEntity *girl1 = [[[GirlEntity alloc] init] autorelease];
girl1.name = @"妹子1";
[me setObject:girl1 forKey:@"girlFriend"];
diaosi说从来没有过妹子,不知道妹子类是什么.
没关系,我们自己造
// 创建一个NSObject对象, 然后添加属性,把他设置成妹子
NSObject *girl2 = [[[NSObject alloc] init] autorelease];
objc_setAssociatedObject(girl2, "name", @"妹子2", OBJC_ASSOCIATION_COPY);
[me setObject:girl2 forKey:@"girlFriend2"];
屌丝说这样还不够彻底.
没关系,我们自己new一个类出来
// 动态创建一个妹子类,然后创建一个妹子
const char *className = "Girl3";
Class kclass = objc_getClass(className);
if (!kclass)
{
Class superClass = [NSObject class];
kclass = objc_allocateClassPair(superClass, className, 0);
}
NSUInteger size;
NSUInteger alignment;
NSGetSizeAndAlignment("*", &size, &alignment);
class_addIvar(kclass, "name", size, alignment, "*");
// 注册到运行时环境
objc_registerClassPair(kclass);
id girl3 = [[[kclass alloc] init] autorelease];
object_setInstanceVariable(girl3, "name", "妹子3");
[me setObject:girl3 forKey:@"girlFriend3"];
如果想带女神回去怎办?
没关系,我们可以挖墙角
// 挖墙角
GirlEntity *girl4 = [[[GirlEntity alloc] init] autorelease];
girl4.name = @"女神";
SEL original = @selector(talk);
SEL replacement = @selector(talk2);
Method a = class_getInstanceMethod([GirlEntity class], original);
Method b = class_getInstanceMethod([self class], replacement);
if (class_addMethod([GirlEntity class], original, method_getImplementation(b), method_getTypeEncoding(b)))
{
class_replaceMethod([GirlEntity class], replacement, method_getImplementation(a), method_getTypeEncoding(a));
}
else
{
method_exchangeImplementations(a, b);
}
[girl4 talk];
-(void) talk2{
NSString *name = [self valueForKey:@"name"];
if ([name isEqualToString:@"女神"]) {
// do 你懂的
NSLog(@"%s", __FUNCTION__);
}
}