一周随笔--15.9.21
一周新知识点记录(15.9.21)
一. writeToFile:atomically:
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
第二个参数的意思是:
如果为YES则保证文件的写入原子性,就是说会先创建一个临时文件,直到文件内容写入成功再导入到目标文件里.
如果为NO,则直接写入目标文件里.
二. NSerror
参数依次为:
1、错误域(NSString)
2、错误标识 (NSInteger)
3、错误信息 (字典)
NSError *error = [NSError errorWithDomain:@"错误域" code:400 userInfo:@{NSLocalizedDescriptionKey:@"错误信息"}];
NSLog(@"%@",error.localizedDescription);
NSLog(@"%@",error.description);
注意:error.description并不是错误信息,NSError没有description这个属性来描述错误信息,这是对error对象的描述
三. ios7的self.view.frame
ios7.0以后如果导航栏translucent为YES,即半透明,那么self.view的始终是以屏幕左上角为坐标(0,0)点的。
如果导航栏translucent为NO,即不透明。那么self.view在加载完毕之后,即视图控制器的viewDidLoad方法之后(注意是之后,不包括viewDidLoad),它的区域不包括导航栏部分,即以导航栏左下角点为坐标(0,0)点,高度也是屏幕高度减去了导航栏高度和状态栏高度。
特别注意在self.view加载未加载完毕,即self.view显示之前(viewWillAppear之前),它还是以屏幕左上角为坐标(0,0)点的。
四. 关于在异步函数中执行主队列中的任务
dispatch_async(dispatch_get_main_queue(), ^{
[self initBaseView];
});
代码示例如上
在主队列中添加任务,并通过异步函数执行。因为主队列中的任务只能在主线程中执行,因此不开辟新的线程,那么该任务在主线程中是串行执行的。这样的话上面代码直接替换成 [self initBaseView];有什么区别呢?
区别在于:加入viewDidLoad:方法里有3段代码,按顺序从上到下依次为A B C。其中B为[self initBaseView];
运行之后,发现3段代码的运行顺序为A,B,C,没有任何问题。但是如果将B放在主队列中用异步函数执行,那么执行的顺序将会是A,C,B。
因为上面的代码是在主队列中加入了待执行的代码段B(任务B),异步函数会等待主线程中在任务B之前的任务(从任务B所在的viewDidLoad:函数,到生命周期的最后一步viewDidAppear:,这些任务事先都已被放置在了主队列中,并排在任务B的前面)执行完毕后才会将任务B从主队列中取出,放在主线程中执行。这就是为什么先执行A,C。再执行B的原因。因此,viewDidLoad一直到viewDidAppear方法执行完毕,才会去执行B。
五. 关于图形上下文创建方法的参数Scale
关于创建图形上下文的两个方法
方法一:UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale);
方法二:UIGraphicsBeginImageContext(CGSize size);
方法一中3个参数依次表示:
size:创建的图形上下文的尺寸大小
opaque:图形上下文是否透明 YES为不透明(当图形完全不透明是设置成YES,否则设置成NO,以优化性能)
scale:图像缩放比例(用于调整图像分辨率)。
在理解之前首先要知道的是,对于手机屏幕而言,我们用分辨率在衡量屏幕的清晰度。分辨率的单位是像素,以iphone6为例,分辨率为750*1336像素。iphone6屏幕的点数是375*568。因此iphone6屏幕一个点包含4个像素(2*2)。这个2就对应屏幕的scale属性,可以通过[UIScreen mainScreen].scale来获取。
理解了上面内容,方法中的scale就不难理解了。这个scale是获取到的图像的缩放比例(或者说是缩放因子),它决定了获取到的图像的分辨率。简单理解,假如scale的值为2,那么获取到的图像一个点有4个像素(长宽各2个)。通常我们把scale的值设置成0,表示设置成默认的缩放比例(跟屏幕相同),对于配备了两倍retain屏的iphone4s、5、5s、6、6s,这个缩放比例默认就是2;如果是6p、6sp,则默认是3,因此scale设置成0或设置成2对于iphone4s、5、5s、6是一样的。
对于方法二而言,并没有scale这个参数,其实它的缺省值为1,并不是0。因此用这个方法创建图形上下文得到的图像质量会比较低(除非iphone3GS)。图像的质量从图像的大小就能区别出来,将获取到的图像保存到沙盒,查看图像大小,轻松辨别。
六. ios7.0截屏新方法
- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates
这个方法制作了一个UIView的副本,参数afterUpdates表示是否在所有效果应用在视图上了以后再获取快照。例如,如果该参数为NO,则立马获取该视图现在状态的快照,反之,以下代码只能得到一个空白快照:
UIView *snapShot = [view snapshotViewAfterScreenUpdates:YES]; [view setAlpha:0.0];
另外一种ios7之后的方法,可以将要截取中的UIView绘制在图形上下文的指定区域,然后获取图像来达到快照效果。
- (BOOL)drawViewHierarchyInRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates
作用对象:要截取的UIView对象
参数说明:
rect:图形上下文上的区域,不是UIView的区域。将UIView绘制到图形上下文rect的区域上。
afterUpdates:同上一个方法
七. 预编译输出宏定义
#ifdef DEBUG #define DebugLog(format,…) NSLog(@"{%s,%d}" format, __FUNCTION__,__LINE__,##__VA_ARGS__) #else #define DebugLog(format,…) #endif
系统宏介绍:
__LINE__:宏在预编译时会替换成当前的行号
__FUNCTION__:宏在预编译时会替换成当前的函数名称
__VA_ARGS__:简单的说,就是将左边…的内容替换进来
##:宏连接符
八. 运算符
&:按位与
|:按位或
^:按位亦或
~:取反
>>:右移
九. 应用打包成ipa
1.先将运行模式设置为真机
2.Xcode上面菜单——Product——Archive
3.右击工程,在finder中打开
4.右击——显示包内容——Products——Applications 看到一个有禁止符号的文件
5.打开Itunes,将该拖进去,这样就能在Itunes的应用程序一栏找到打包好的ipa文件了。