1. 制作静态库时,真机和模拟器的库文件是不一样的,因此要合并起来。
lipo -create ../Release-iphonesimulator/*.a ../Release-iphoneos/libPrint.a
-output ../libPrint.a
2. NSlog只在debug状态下打出,在release状态下就无视掉。提高产品的性能。
先介绍几个常用的宏:
- __VA_ARGS__ 是一个可变参数的宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉,否则会编译出错。
- __FILE__ 宏在预编译时会替换成当前的源文件名
- __LINE__宏在预编译时会替换成当前的行号
- __FUNCTION__宏在预编译时会替换成当前的函数名称
- __OPTIMIZE__ 是release 默认会加的宏
#ifndef __OPTIMIZE__
#define MyLOG(...) NSLog(__VA_ARGS__)
#define MyPrintBaseLog NSLog(@"%s(%d)", __FUNCTION__, __LINE__)
#define MyDebugLog(s, ...) NSLog(@"%s(%d): %@", __FUNCTION__, __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__])
#else
#define MyLOG(...)
#define MyPrintBaseLog
#define MyDebugLog(s, ...)
#endif
更改debug和release状态:
Edit Scheme -> Run project -> Build Configuration
3. ARC的问题
- 1.在targets->build phases中修改compiler Flags属性,添加:-fobjc-arc,就可以让旧的工程支持arc;
- 2.在targets->build phases中修改compiler Flags属性,添加:-fno-objc-arc,就可以让原来支持arc的工程不使用arc,对于大部分第三方类库来说都可以顺利编译通过
4. 调用系统的工具
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://10086"]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://10086"]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://xxx@apple.com"]];
补充:调用自己的app。
在如下URL Schemes 添加自定义的Scheme。然后就可以在Safari中输入"begin://",启动你的app了。当然后面也可以跟参数,例如:begin://test/path?p=1&q=2....
处理方法是
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url; // Will be deprecated at some point, please replace with application:openURL:sourceApplication:annotation:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation NS_AVAILABLE_IOS(4_2); // no equiv. notification. return NO if the application can't open for some reason
保险起见,两个方法最好都重写一下。
5. 延时函数:
[NSThread sleepForTimeInterval:3];
[self performSelector:@selector(machineBallAction) withObject:nil afterDelay:0];
6.记录程序运行的时间。
clock_t begin = clock();
// do somethingclock_t end = clock();NSLog(@"used time:%f s",(end - begin)/(float)CLOCKS_PER_SEC);
7. 在适配不同版本的系统时,有一些方法在新版本里已经被代替了,但是旧版本又不支持新版本的方法,所以特殊情况下,要对系统版本进行判断,然后分别实现两种不同的方法,这样在xcode里面就会出现如下警告,作为优美代码的coder,当然不想看到折么刺眼的东西。
下面给出一种方法来消除这样的警告。
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
//deprecated methods.
#pragma GCC diagnostic pop
同样在“performSelector:withObject”的时候,如果selector是动态变化的,那么也有警告,可以用类似的方法来消除
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[self performSelector:oneSelector withObject:object];
#pragma clang diagnostic pop
8. 快速清空subViews
[self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
9. trim掉string的空格
aString = [aString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
10. 添加自定义字体
首先将*.ttf文件添加到工程中,然后在info.plist文件中添加一个key, key的名字是Fonts provided by application,默认是array,然后将添加的字体文件名字写到后面就行了。
在工程用的时候可以直接
[UIFont fontWithName:@"******" size:20.0];
如果名字不知道的话可以遍历一下。
11. NSLOG
NSLog函数支持printf函数所有的格式和控制符号。而且它还可以支持%@来打印一个对象。当使用%@时,给对象发送description消息,description方法返回一个字符串来代替%@。
符号 显示
%@ id
%d,%D,%i long
%u,%U unsigned long
%hi short
%hu unsigned short
%qi long long
%qu unsigned long long
%x,%X 16进制打印unsigned long
%o,%O 8进制打印 unsigned long
%f,%e,%E,%g,%G double
%c unsigned char-ASCII 字符
%C unichar-Unicode 字符
%s char* (以空字符结束的ASCII字符组成的字符串)
%S unichar* (以空字符结束的Unicode字符组成的字符串)
%p void* (以0x开头的16进制的地址空间)
%% A%字符
不定时更新
部分内容来源于网上,不能一一列出出处,请恕罪。