版权声明:本文为博主原创文章,未经博主允许可以转载,但转载时请附上原文地址: 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;
}
参数说明:
- NS_FORMAT_FUNCTION(1, 2) 告诉编译器,索引1处的参数是一个格式化字符串,而实际参数从索引2处开始
- va_list 定义一个指向个数可变的参数列表的指针,这个参数列表指针就是 arglist
- va_start 使参数列表指针指向 format,从 format 的下一个元素开始(必须有)
- va_end 结束,清空 va_list 可变参数列表(必须有)