美文网首页
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