iOS tips 11

2016-05-21 | 阅读

ios 自动布局之VFL

Visual format language 使用一种简单的语言来设置简单的约束 :

startBtn.translatesAutoresizingMaskIntoConstraints = NO;
[self.hintBackgoundImageView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[startBtn(==44)]-20-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(startBtn)]];
[self.hintBackgoundImageView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[startBtn(==88)]-20-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(startBtn)]];

H 表示水平,V表示竖直, - 表示间距 , -20- 表示间距20 , 右边views:NSDictionaryOfVariableBindings里的id可以写在字符串中,而(==88) 表示这个对象的长宽约束.

//直接等宽或等高
@"H:|-[button1(button)]"

使用NSDictionary和的[]语法

有时候某些类也会有NSDictionary的根据key查询,也想要写[]的语法糖,则可以如此声明函数:

- (NSObject *)objectForKeyedSubscript:(id)key;
- (void)setObject:(id)object forKeyedSubscript:(NSObject <NSCopying> *)key;

同样,类似NSArray的语法糖,也可以如此定义:

- (NSObject *)objectAtIndexedSubscript:(NSUInteger)index;
- (void)setObject:(id)object atIndexedSubscript:(NSUInteger)index;

查看可执行文件的组成

Xcode , 开启编译选项Write Link Map File,Build Settings中搜索map, 将Write Link Map File选项设为yes,同时也指定linkMap的存储位置.

这个LinkMap中展示了整个可执行文件的全貌,列出了编译后的每一个.o目标文件的信息,以及每一个目标文件的代码段,数据段存储详情.

iOS断言,直接崩溃

NSAssert ( ) 

在表达式失败的时候崩溃,也就是表达式里面是正确的内容.

NSAssert(1);// 这是不崩
NSAssert(0);// 崩.

企业证书是有两份的

Apple 为每个账号提供了两个证书,这两个证书可以同时生效,这样在正在使用的证书过期之前,可以使用另外一个证书打包发布,让用户升级到新版本。

添加字体

  1. 字体库拖入
  2. info.plist 添加一行 UIAppFonts的 Dictionary, 在key就为 item 0,然后添加Value为 xxx.ttf.
  3. 输出所有字体 :

     NSArray *familyNames = [UIFont familyNames];  
     for( NSString *familyName in familyNames ){  
         printf( "Family: %s \n", [familyName UTF8String] );  
         NSArray *fontNames = [UIFont fontNamesForFamilyName:familyName];  
         for( NSString *fontName in fontNames ){  
             printf( "\tFont: %s \n", [fontName UTF8String] );  
         }  
     }
    
  4. 找到添加的字体名称,然后就可以使用了.

对于唯一标示符

唯一标示符可以从很多地方获取,以下介绍一些:

  • UDID : 曾经iOS中的唯一标示符,但是在iOS6之后被苹果禁用了
  • MAC : mac地址,mac地址用于在网络上区分设备的唯一性,所以所有接入网络的设备都有唯一的MAC地址,但是在iOS7后,被苹果禁用了。
  • IDFA : 对外广告推广。在iOS6中,提供新的UUID,这个id由系统储存,但是可能会被重置,如用户重置系统,或者点击还原广告。用户关闭广告追踪,这个id也会遇到取不到的情况。获取这个值,需要引入 AdSupport包,然后NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
  • IDFV : 对内,用户分析。提供给Vendor供应商的标示,同一个供应商的应用指通过BundleID的DNS反转的前两部分进行匹配,相同则说明是同一个Vendor,共享一个idfv的值。这个值非常使用于内部行为分析。 如果用户将属于此Vender的所有APP卸载,则这个值会被重置。
  • OpenUDID : 开源项目openudid,生成的UUID储存在UIPasteboard中,所有带有openudid的应用共享这个数据。但是如果所有带有OpenUdid的应用都被卸载了,保存在UIPasteBoard中的数据也是会被清除的。

如果为了一个公司提供唯一的标示符,可以选择使用IDFV,放在公司级的keychain中储存,这样多个应用就可以共用一份id,且删除应用再重新安装,ID依旧存在。

对于symbols no found 的检测

Xcode在编译项目进行link时,会检测函数符号是否能找到。但Xcode只对调用了类方法的类进行检测,没有调用类方法的类 不进行检测。所以第三方库如果没有调用它们的类方法,而调用了第三方库的其它方法时,是不会弹出symbols no found的报错的。

处理器指令集

几乎所有的手机处理器都是基于arm。iOS中有 :

  • Armv6 :上古架构,已被抛弃, iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch
  • Armv7 : iPhone3GS, iPhone4, iPhone4S iPod Touch 3G, iPod Touch4
  • Armv7s : iPhone5, iPhone5C
  • Arm64 : iPhone5S ,iPhone6 , iPhone6s,iPhone7
  • i386 : 32位模拟器
  • x86_64 : 64位模拟器

所有指令集原则上是向下兼容的,即当前最新的arm64指令集的iphone6的手机,能够运行 armv6 等架构的代码,只不过执行效率没有那么高,因为新的指令集上会有相关的性能优化。

Xcode的Building Setting中,常用的设置选项有:

  • Architectures : 指明选定 Target要求被编译生成的二进制包所支持的指令集。支持指令集越多,生成的包也就越大。
  • Valid Architectures : 依旧是指明可能支持的指令集。即Valid ArchitecturesArchitectures列表的交集,才是XCode最终生成二进制包所支持的指令集。
  • Build Active Architecture Only : 指明是否只编译当前链接设备的指令集。 即在调试过程中,不会编译全部的架构,只编译链接机器的架构。