zoukankan      html  css  js  c++  java
  • 一周随笔--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文件了。

  • 相关阅读:
    对于使用secureFX上传文件到centos7 的时候,以及不同的用户解压文件,对于文件操作权限的实验
    搭建分布式hadoop环境的前期准备---需要检查的几个点
    mvc EF
    查询数据库的相关信息
    SQL中PIVOT 行列转换
    sql server 取日期
    c# 类型拷贝
    EF没有同步更新(转)
    怎么计算两个经纬度之间的距离.
    简单日志记录
  • 原文地址:https://www.cnblogs.com/lotheve/p/4826978.html
Copyright © 2011-2022 走看看