直接通过ReactNative方式创建项目
安装
必须安装:Xcode,Homebrew,node,npm
npm其实是Node.js的包管理工具,已经在Node.js安装的时候顺带装好了。
可选:React Native的命令行工具,IDE(Atom/Nuclide/Webstorm/Sublime),watchman,Flow
必须安装:Xcode,Homebrew,node,npm
npm其实是Node.js的包管理工具,已经在Node.js安装的时候顺带装好了。
可选:React Native的命令行工具,IDE(Atom/Nuclide/Webstorm/Sublime),watchman,Flow
cookies 存储在浏览器。而会话存储在服务器端
1.补全:alt+/
2.修复:ctrl+1
Java开发需要:
1.JDK (Java Deverlopment Kit)
Java开发工具包(JDK)是一个用于开发Java应用程序和小程序的软件开发环境。
它包括Java运行时环境(JRE),编译器/加载程序(JAVA),编译器(javac),归档器(jar),文档生成(Javadoc)以及 Java 开发的其他工具。
项目crash时,添加异常断点运行,会定位到出错的代码行
右击断点,condition中添加触发断点的条件,比如循环中使用
NSLog的打印是非常低效的,甚至比print低100倍,以下NSLog更高效,并且可以获取更多信息。1
2
3
4
5
6
7
8//A better version of NSLog
#define NSLog(format, ...) do { \
fprintf(stderr, "<%s : %d> %s\n", \
[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], \
__LINE__, __func__); \
(NSLog)((format), ##__VA_ARGS__); \
fprintf(stderr, "-------\n"); \
} while (0)
使用do-while是为了避免吃掉分号问题
1 | NSStringFromClass |
开启:edit scheme->Diagnostics->Zombie Objects,当访问已经被释放的对象时将会获取到更多的信息。
LLVM:编译器
lldb:LLVM的调试器
可以在调试时动态执行指定表达式,并将结果打印出来。常用于在调试过程中修改变量的值。
expression的完整语法是这样的:1
expression <cmd-options> -- <expr></expr>
一般情况下,我们直接用expression还是用得比较少的,更多时候我们用的是p、print、call。这三个命令其实都是expression –的别名(–表示不再接受命令选项,详情见前面原始(raw)命令这一节)
一般打印的时候,打印出来的是对象的指针,而不是对象本身。如果我们想打印对象。我们需要使用命令选项:-O。为了更方便的使用,LLDB为expression -O –定义了一个别名:po
输入命令bt
,可以打印出来所有的frame。如果仔细观察,这些frame和左边红框里的堆栈是一致的。平时我们看到的左边的堆栈就是frame。
image 命令可用于寻址,有多个组合命令。比较实用的用法是用于寻找栈地址对应的代码位置。
image lookup –address
当发生崩溃时,想寻找栈地址对应的代码位置,简写为image lookup -a。
1 | image lookup --address 0x0000000100004af8 |
image lookup –name
当我们想查找一个方法或者符号的信息,比如所在文件位置等,尤其当文件被封装为.a库时,简写为image lookup -n。
1 | (lldb) image lookup -n dictionaryWithXMLString: |
image lookup –type
当我们想查看一个类型的时候,可以使用image lookup –type,简写为image lookup -t
1 | (lldb) image lookup -t Model |
#include <>:预处理器会搜索C函数库头文件路径下的文件
#include “”:首先搜索程序所在目录,其次搜索系统Path定义目录,如果还是找不到才会搜索C函数库头文件所在目录。
C中的宏分为两类,对象宏(object-like macro)和函数宏(function-like macro)。
可以使用\
将宏分成了好几行来写。
当你使用了#define宏定义后,则在整个程序的运行周期内这个宏都是有效的,但有时候我们在某个逻辑里希望这个宏失效不想使用,则会使用:1
2
3
4#define NetworkOn //定义一个宏,如果该宏定义了,则在应用里使用网络
-(void)closeNetwork{//突然发生意外的情况,网络无法使用了,调用该方法,取消NetworkOn的宏定义
#undef NetworkOn
}
判断是否开启ARC1
2
3
4#if !__has_feature(objc_arc)
//如果没有开启ARC这里可以做一些错误处理
#error "没有开启ARC"
#endif
判断系统版本1
2
3#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0
//如果iOS版本低于7.0
#endif
判断设备信息1
2
3
4
5
6#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#if IS_IPAD
//这台设备是IPAD
#else
//不是
#endif
#if define = #ifdef
#if !define = #ifndef
#elif = “else if”
Build Settings->Treat Warning as Errors,如果你设置成Yes,那么你的waring就等于error,编译不了。
创建一个警告:
1 | //Generate a warning |
关闭警告
如果需要全局关闭的话,直接在Other C Flags里写-Wno-…就行了,比如-Wextra -Wno-sign-compare就是一个常见的组合。
如果相对某几个文件开启或禁用警告,在Build Phases的Compile Source相应的文件中加入对应的编译标识即可。
如果只是想在某几行关闭某个警告的话,可以通过临时改变诊断编译标记来抑制指定类型的警告,具体如下:
1 | #pragma clang diagnostic push |
#pragma mark
#pragma mark -1
2
3#pragma clang diagnostic push
#pragma clang diagnostic ignored "clang的参数"
#pragma clang diagnostic pop
改变当前行的行号在编译器中的表示1
2#line 100 //指定下一行的__LINE__为100
printf("%d\n",__LINE__);
注意:
1.使用真机调试
2.使用发布配置
1在底部的Call Tree中勾选: