一周新知识点记录(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:函数)执行完毕才会将任务B从主队列中取出,放在主线程中执行。这就是为什么先执行A,C。再执行B的原因。因此,viewDidLoad方法执行完毕,才会去执行B。
五. 关于图形上下文创建方法的参数Scale
关于创建图形上下文的两个方法
方法一:UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale);
方法二:UIGraphicsBeginImageContext(CGSize size);
方法一中3个参数依次表示:
size:创建的图形上下文的尺寸大小
opaque:图形上下文是否透明 NO为不透明
scale:图像缩放比例(用于调整图像分辨率)。
在理解之前首先要知道的是,对于手机屏幕而言,我们用分辨率在衡量屏幕的清晰度。分辨率的单位是像素,以iphone6为例,分辨率为750*1336像素。而我们所说的屏幕的尺寸,对于iphone6而言则是375*668,单位是点。因此iphone6屏幕一个点包含4个像素(2*2)。这个2就对应屏幕的scale属性,可以通过[UIScreen mainScreen].scale来获取。
理解了上面内容,方法中的scale就不难理解了。这个scale是获取到的图像的缩放比例(或者说是缩放因子),它决定了获取到的图像的分辨率。简单理解,假如scale的值为2,那么获取到的图像一个点有4个像素(长宽各2个)。通常我们把scale的值设置成0,表示设置成默认的缩放比例(跟屏幕相同),对于配备了两倍retain屏的iphone4s、5、5s、6,这个缩放比例默认就是2;如果是6p,则默认是3,因此scale设置成0或设置成2对于iphone4s、5、5s、6是一样的。
对于方法二而言,并没有scale这个参数,其实它的缺省值为1,并不是0。因此用这个方法创建图形上下文得到的图像质量会比较低(除非iphone4)。图像的质量从图像的大小就能区别出来,将获取到的图像保存到沙盒,查看图像大小,轻松辨别。
六. ios7.0截屏新方法
- (BOOL)drawViewHierarchyInRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates
该方法对指定UIView作用,通过将UIView的内容绘制到图形上下文上然后获取图像来达到截取UIView的效果。
作用对象:要截取的UIView对象
参数说明:
rect:图形上下文上的区域,不是UIView的区域。将UIView绘制到图形上下文rect的区域上。
afterUpdates:尚不清楚。推测设置成NO立即截取
七. 预编译输出宏定义
#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文件了。