收集一些编程中自己用的工具,随着经验的增加会越来越多。
宏在编程中还是非常有用的,而且效率高,只是没有类型检查而已。
//行数
#define PRINT_LINE printf("file:%s line:%d\n",__FILE__,__LINE__);
//打印对象类型
#define PRINT_OBJTYPE(obj) NSLog(@"the %s type is %@\n",#obj,[obj class]);
//断言,并有文件名,行数提示
#define MYASSERT(value) if(!(value)){ \
printf("myAssert Failed: (%s) in ",#value);\
PRINT_LINE\
};
//json解析中经常遇到dictionary和array的混淆调用不存在的函数出错又不提示错误的地址,有时断言一下会非常有用。
#define MYASSERT_ARRAY(obj) if(![obj isKindOfClass:[NSArray class]]){ \
NSLog(@"obj:%@ is not NSArray but is %@ at file:%s line:%d",obj,[obj class],__FILE__,__LINE__); \
};
#define MYASSERT_DICT(obj) if(![obj isKindOfClass:[NSDictionary class]]){ \
NSLog(@"obj:%@ is not NSDictionary but is %@ at file:%s line:%d",obj,[obj class],__FILE__,__LINE__); \
};
#define DEG2RAD 0.017453f //角度转弧度的乘法因子
#define RAD2DEG 57.295779f //弧度转角度
#define SAFE_RELEASE(obj) [obj release];obj = nil; //释放一个对象时最好把它清零,所谓安全释放
在索引NSArray常常数组越界闪退,如果能不闪退并且能输出那一行出错那将非常有用,这里结合宏和Catagory的功能:
#define OBJECT_AT(index) MyObjectAtIndex:(index) File:__FILE__ Line:__LINE__ //还可以想办法加个对象的类型判断更安全
@implementation NSArray (ExtentionArray)
-(id)MyObjectAtIndex:(int)index File:(char*)file Line:(int)line{
id obj = nil;
if (index >= 0 && index < [self count]) {
obj = [self objectAtIndex:index];
}else{
NSLog(@"[error array:%@ index:%d 越界 count:%d | 在文件:%s 第:%d 行]",self,index,[self count],file,line);
}
return obj;
}
@end
//用法就是
[arrayObject OBJECT_AT(index)];
还需要这样处理的函数有 [NSDictionary setObject: forKey:] ,[NSString substring]
//url正则匹配,这种非常简洁高效,前提是保证url没有中文空格 ,结束判断是以中文空格为条件的。
NSString *urlPattern = @"(http|ftp|https)://([^\u4E00-\u9FA5^ ])*";
还有个emoji字符的匹配,这里显示不了就不贴上了。