一周随笔--15.9.21

一周新知识点记录(15.9.21)

一. writeToFileatomically

- (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对象的描述

参考


 三. ios7self.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文件了。

posted @ 2015-09-21 19:05  Lotheve  阅读(272)  评论(0编辑  收藏  举报