美文网首页
iOS开发--Runtime的应用

iOS开发--Runtime的应用

作者: 小码嘟嘟 | 来源:发表于2017-03-17 11:52 被阅读31次

今天看了一下QQ,微博,facebook等比较知名的App个人页导航栏的设置,由此认识了一下objc_setAssociatedObject,objc_getAssociatedObject,class_getInstanceMethod,class_getClassMethod这个几个方法的是用法

1.首先是class_getInstanceMethod,class_getClassMethod,下面是具体用法

比如我创建一个对象Car;

Car下面有一个类方法,和一个实例化方法

+  (void)drivingCar{

}

- (void)stopCar{

}

接着我们就要实现例子了

Car *car = [[Car alloc] init];

//得到实例化的方法

Method InstanceMethod = class_getInstanceMethod([car class], @selector(stopCar))

//得到类方法

Method method = class_getCalssMethod([Car class], @selector(drivingCar))

有需求的话我们还可以交换两个方法的实现

method_exchangeImplementations(InstanceMethod, method)

2.如果我们需要一个对象关联一个属性,这个属性可以和对象没有任何联系,那么就可以用到objc_setAssociatedObject,objc_getAssociatedObject

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

......

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"

message:@"你在吃饭吗"

delegate:self

cancelButtonTitle:@"好的"

otherButtonTitles:nil];

//然后这里设定关联,此处把indexPath关联到alert上

objc_setAssociatedObject(alert, &kUITableViewIndexKey, indexPath, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

[alert show];

}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

{

if (buttonIndex == 0) {

NSIndexPath *indexPath = objc_getAssociatedObject(alertView, &kUITableViewIndexKey);

NSLog(@"%@", indexPath);

}

}

相关文章

网友评论

      本文标题:iOS开发--Runtime的应用

      本文链接:https://www.haomeiwen.com/subject/hyhnlttx.html