iOS 利用runtime替换系统的NSString stringWithFormat:方法

版权声明:本文为博主原创文章,未经博主允许可以转载,但转载时请附上原文地址: https://blog.csdn.net/youshaoduo/article/details/85236099

其实还是建议大家写分类(category),直接替换系统方法很有可能导致APP在运行过程中出现各种奇奇怪怪的问题,毕竟系统方法不止你自己在调用:

+ (void)exchangeNSString {
    SEL sel1 = @selector(stringWithFormat:);
    Method a = class_getClassMethod([NSString class], sel1);

    SEL sel2 = @selector(myStringWithFormat:);
    Method b = class_getClassMethod([My class], sel2);

    method_exchangeImplementations(a, b);
}

+ (NSString *)myStringWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2) {
    va_list ap;
    va_start(ap, format);
    
	//这里必须使用可变字符串,不然随机崩溃,原因嘛,是因为与系统的一些方法冲突了
    NSMutableString * result = [[NSMutableString alloc] initWithFormat:format arguments:ap];
    NSLog(@"myStringWithFormat: %@", result);
    va_end(ap);
    return result;
}

- (NSString *)mystringByAppendingFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2) {
    va_list ap;
    va_start(ap, format);
    NSMutableString * result = (NSMutableString *)[(NSMutableString *)self stringByAppendingString:[[NSMutableString alloc] initWithFormat:format arguments:ap]];
    va_end(ap);
    return result;
}


参数说明:

  1. NS_FORMAT_FUNCTION(1, 2) 告诉编译器,索引1处的参数是一个格式化字符串,而实际参数从索引2处开始
  2. va_list 定义一个指向个数可变的参数列表的指针,这个参数列表指针就是 arglist
  3. va_start 使参数列表指针指向 format,从 format 的下一个元素开始(必须有)
  4. va_end 结束,清空 va_list 可变参数列表(必须有)

猜你喜欢

转载自blog.csdn.net/youshaoduo/article/details/85236099