开发Tips收集-2015年12月

这些小Tips为本人近期读书笔记,收集来自网络开发者发布的技术文档,并非原创,共享的目的是为了扩散分享技术,共同进步。如有侵权不得转载等情况,请联系我告知,谢谢!

  • 所谓闭包,就是函数及其词法作用域的合称
  • 什么不是重构?:
    1. 添加新功能
    2. 改变某个类型的公共接口
    3. 改变某个类型的行为
      这些东西都只能叫做重写。有一个很简单的判断方式:你是否需要改变单元测试?如果需要的话,那么只就是重写,否则的话才是重构。
  • 设置UIView的背景图片
    1. 将图片作为UIView的背景色,会在生成color时占用大量的内存。如果图片大小不够,就会平铺多张图片,不会去拉伸图片以适应View的大小
    2. 在UIView上再添加一个UIImageView显示图片作为UIView的背景图片
  1. iOS视图都是一个图层,最先放置的图层就会在最底层,如此最先给UIView添加一个UIImageView就可以作为UIView的背景图片使用

    1. 其他方式(推荐)

    NSString *path = [[NSBundlemainBundle]pathForResource:@”image”ofType:@”jpg”];
    UIImage *image = [UIImageimageWithContentsOfFile:path];
    self.view.layer.contents = (id)image.CGImage;

  • 代理,又称委托代理(delegate),是iOS中常用的设计一种模式。顾名思义,它是把某个对象要做的事情委托给别的对象去做。那么别的对象就是这个对象的代理,代替它来打理要做的事。反映到程序中, 首先要明确一个对象的委托方是哪个对象,委托所做的内容是什么。在iOS程序设计中,委托通过一种@protocol的方式实现,所以又称为协议。在iOS的SDK里面,UITableView、UITextField等都有用到这种设计模式。
  • 协议,是多个类共享的一个方法列表,在协议中所列出的方法没有响应的实现,由其它类来实现。委托是指给一个对象提供机会对另一对象中的变化做出反应或者相应另一个对象的行为。其基本思想是协同解决问题。
  • 委托模式能够起到两方面的作用:
    1. 代理协助对象主体完成某项操作,将需要定制化的操作通过代理来自定义实现,达到和子类化对象主体同样的作用。
    2. 事件监听,代理对象监听对象主体的某些重要事件,对事件做出具体响应或广播事件交给需要作出响应的对象。
  • NSString是不可变的,意思是他声明的对象我们不可以改变,如果要改变,可以使用它的子类:NSMutableString
  • 高阶函数,指可以将其他函数作为参数或者返回结果的函数。Swift中的函数都是高阶函数
  • 对象是附有行为的数据,而闭包是附有数据的行为。
  • 推测苹果审核团队设备验收选型也会遵循原则:验收最新发布的两个系统版本,两个硬件版本。保证游戏可以在市场占有率最高的两个系统版本及硬件配置上可以流畅运行。
  • 预审组通过细分将预审工作划为3大模块:客户端资源检查、应用内容检查和提审资源检查:
    1. 客户端资源检查:确保客户端内Plist等配置符合苹果要求,不存在多余的Key值enable;
    2. 应用内容检查:对应用的内容进行审查,确认无涉及色情、庸俗、暴力、枪支等内容;并对公告文字等筛查,无苹果禁止的字眼等;应用内不包含cdkey兑换,好友邀请及炫耀等苹果最新禁止的内容;
    3. 提审资源检查:确保提交的游戏截图、视频符合苹果要求,且截图及视频中没有敏感信息;同时视频截图等均符合苹果的技术要求,帧率分辨率达标.
  • 模块化编程才是正道,尽量使用 struct 和 enum 代替 class,把 extension 和 protocol 当做胶水,把逻辑和行为分开,总结起来就是珍爱POP/VOP,远离OOP
  • 为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
  • IOS字号转换:
    pt=(px/96)*72
    1 in = 2.54 cm = 25.4 mm = 72pt
    px(Pixel):像素,相对长度单位。
    pt(Point):点,绝对长度单位。
  • 系统的这些视图控制器,都实现了CALayer的delegate,当vc的根视图的frame发生变化的时候会接受到通知layoutSublayersOfLayer,系统的视图控制器会在这里面调用这两个函数来通知其当前的子VC去做布局的工作:
    1. viewWillLayoutSubviews
    2. viewDidLayoutSubviews
  • 工程Info中:
    1. CFBundleVersion,标识(发布或未发布)的内部版本号。这是一个单调增加的字符串,包括一个或多个时期分隔的整数。
    2. CFBundleShortVersionString标识应用程序的发布版本号。该版本的版本号是三个时期分隔的整数组成的字符串。第一个整数代表重大修改的版本,如实现新的功能或重大变化的修订。第二个整数表示的修订,实现较突出的特点。第三个整数代表维护版本。该键的值不同于“CFBundleVersion”标识。
    3. Version 对应的就是CFBundleShortVersionString (发布版本号 如当前上架版本为1.1.0 之后你更新的时候可以改为1.1.1)。
    4. Build 对应的是 CFBundleVersion(内部标示,用以记录开发版本的,每次更新的时候都需要比上一次高 如:当前版本是11,下一次就要大于11 比如 12,13 ….10000)
  • iOS app icon 通用设计规则:
    1. 如果品牌 LOGO 在「颜色」上的展示诉求大于「造型」的话,可用白色背景加品牌 LOGO;
      1. 如果品牌 LOGO 「造型」足够独特具有高识别度,或对「颜色」诉求相对较小的话,则可用品牌色做背景;
      2. 如果产品拥有具象的形象物或场景的话,可设计「拟物化」或「 场景化」的图标(游戏图标居多)。
  • 当用户点击屏幕后,首先开启的是查找hit-View的过程。从window开始,给所有直接子视图发hit-Test的消息,直到某一个控件没有子视图了,并且这个触点在这个子视图中,则返回这个控件,于是hit-View找到了。找到hit-View后,view则成为了需要第一个为这个事件提供响应的对象,如果,该对象没有提供事件响应,则该事件对象会向视图的父视图继续传递,如果父视图依然没有提供响应,则继续向上传递,直到传递到UIApplication对象,依然没有处理的话,则抛弃该事件。这个过程叫做响应者链。
  • Swift 2.1 现在可以在字符串插值中使用双引号。表达式字符串插值现在可以包含字符串了。比如,“My name is \ (attributes[“name”]!)” 现在是有效的。
  • 通过NSURLConnection主要通过四个类进行网络访问:NSURL,NSURLRequest,NSMutableURLRequest,NSURLConnection
    1. NSURL:请求地址
    2. NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法、请求头、请求体….
    3. NSMutableURLRequest:NSURLRequest的子类
    4. NSURLConnection:负责发送请求,建立客户端和服务器的连接。发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据
  • 缩放的一般实现步骤 (比如缩放UIScrollView内部的UIImageView)
    1. 设置UIScrollView的delegate为控制器 (self)
    2. 控制器遵守UIScrollViewDelegate协议 \
    3. 控制器实现viewForZoomingInScrollView:方法, 返回需要缩放的子控件
    4. 设置最大和最小缩放比例
  • 添加视图代码几个建议:
    1. 避免调用 layoutSubviews,在 viewDidLayoutSubviews 和 viewDidAppear 中进行 frame 的获取
    2. 如果你需要尽早地做一些大动作,推荐在 viewDidLayoutSubviews,此时用户还没有看到 UI,用法可以更灵活
    3. 注意 viewDidLayoutSubviews 可能会被多次调用,所以添加元素之类的操作尽量避免在这里做
    4. viewDidAppear 中可以干一切你想干的事情,但是一些需要用户看到的东西例如动画只能在这里做
    5. 更推荐把需要做的事情尽量全部放到 viewDidAppear 中来做,让用户尽早地看到界面,这是人机交互的基本原则
  • 对view的layer的修改是发生在约束调整之前的如果layer和约束存在关联的话就需要好好调试了