目录结构:应该以
主目录按照模块分类,内目录按照业务分类
一、轻文档先行
为什么?
1.需求本身就存在问题,代码写一半才发现
2.部分需求没有表达清楚,发现的时候去沟通,结果发现与原来的代码冲突
3.代码写一半时候,思路不清晰了,没有大纲
文档写什么?
1.准备工作
数据库表准备;
抽象出模型类;
接口协议;
测试环境;
测试帐号;
2.罗列需要做的小功能点
3.记录需求的改动点(非新需求)
4.罗列自测试内容
在IOS开发中,经常会遇到NS开头的对象,这个要从乔帮主历史恩怨说起。当年Steve Jobs 和John Scullery与恩怨,乔帮主当年被人挤兑出苹果,自立门户的时候做了个公司叫做NextStep,里面这一整套开发包很是让一些科学家们喜欢,而现在Mac OS用的就是NextStep这一套函数库。
CF说的是Core Foundation,CA说的是Core Animation,CG说的是Core Graphics,UI说的是iPhone的User Interface
MRC 和 ARC 混编
既可以给ARC 项目添加MRC标记(-fno-objc-arc),也可以给MRC项目添加ARC标记(-fobjc-arc)。
添加pch文件,规则是: 项目名/xxxxx.pch(添加到项目target不是test target)
xcode7 加这个访问网络
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
现在Xcode 6创建的项目默认是不带pch文件的,当然了旧版本的项目是会保留的。那么如何添加pch文件?
* Command + N 然后在Other里面选择 PCH File
* 在Build Settings里面找到 Prefix Header
* 添加pch文件,规则是: 项目名/xxxxx.pch
查看警告类型
注意到其中 [-Wshorten-64-to-32],在这个括号中的就是 这种警告的类型 -W是前缀,这个前缀表示的是 打开这种类型的警告 如果我们是要关闭某种类型的警告的话, 要将 -W换成 -Wno-
强制去除某一警告
#pragma clang diagnostic ignored
语法来强制去除xcode的编译警告,代码举例如下:
1 2 3 4 | #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-bridge-casts-disallowed-in-nonarc" CGImageSourceUpdateData(imageSource, (__bridge CFDataRef)imageData, totalSize == expectedSize); #pragma clang diagnostic pop |
注意,如果不添加
#pragma clang diagnostic push/pop
的话,将导致忽略语句一直有效。
要寻找编译器警告类型的方法如下图:
2去除一个源文件内所有某种类型的警告@“第一个是给arc项目添加mrc的文件的标记”
3. 去除一个工程中某种类型的警告
//pod加这句话然后install去除警告
inhibit_all_warnings!
pod install --verbose --no-repo-update
po
在调试阶段这个命令非常有用。通常情况下,为了打印变量的值,我们需要移动鼠标指针并点击和选择打印描述打印值。有时候这种做法对编程并不友好,而po命令让这个过程变得简单且迅速 ,看一个示例。
在该示例中,我已经创建了一个命名为str的字符串,并为其赋值。现在要在不移动光标的情况下打印该值,我现在仅需要在输出窗口编写"po variable name"并摁下Enter键。如下所示,你将会得到储存在变量中的值。
一般图片和各种格式的文档用webView加载
warning
当你想要将代码区分为两个类别时可使用该功能,一个为了实验,另一个是实际使用的,比如
如果我们将0(zero) 改为1(one),警告会自动删除,如下:
该功能将帮你确保你绝不会发布包含不该出现在此的代码,或者排除了应该出现的代码。
block定义
/.h
typedef void(^MyBlock)(int value);
@property (nonatomic,weak) MyBlock block;
-(void)setMyBlock:(void(^)(int value)) block;
/.m
-(void)setMyBlock:(void(^)(int value)) block {
if (block) {
self.block=block;
}
}
// Adding timer to runloop to make sure UI event won't block the timer from firing
_timer = [NSTimer timerWithTimeInterval:timeOffset target:self selector:selector userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
解决self循环引用可以这么做
__typeof(self) __weak weakSelf = self;