开发Tips收集-2015年11月以前

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

  • 当view被添加其他view中之前时,会调用viewWillAppear,而之后会调用viewDidAppear;当view从其他view中移出之前时,会调用viewWillDisAppear,而之后会调用viewDidDisappear;当view不在使用,而且是disappeared,受到内存警告时,那么viewController会将view释放并将其指向nil
  • UIImageView的用户交互是默认关闭的,加在它上面的控件自然也响应不了事件。只要把UIImageView的userInteractionEnabled改为YES就能解决问题了。
  • delegate的回调更多的面向过程,而block则是面向结果的。如果你需要得到一条多步进程的通知,你应该使用delegation。而当你只是希望得到你请求的信息(或者获取信息时的错误提示),你应该使用block。
  • 如果将数据块传递给一个函数或方法,可以通过传递一个自动释放NSData来实现,无需担心内存清除问题
  • data source也是一种特殊的delegate,data source负责传输数据给View例如data、at、count等,而delegate负责处理View的did、should、will等问题,View把需要的数据信息或者事件信息传输给dalegate,dalegate则负责回复这些信息
  • 让表视图进入编辑模式,进入编辑模式的方法有两种,一种是使用导航栏的edit按钮,另一种是设置tableView的editing属性进入编辑模式
  • const常量是一个在编译时或者编译解析时被初始化的变量。通过let创建的是一个运行时常量,是不可变得。它可以使用stattic 或者dynamic关键字来初始化。谨记它的的值只能被分配一次
  • 多使用结构体,除非你用了继承和引用语义。类支持继承,结构体不支持。 类是引用类型,结构体是值类型。在运行时,结构体的在性能方面更优于类,原因是结构体的方法调用是静态绑定,而类的方法调用是动态实现的。这就是尽可能得使用结构体代替类的又一个好的原因。
  • nil:指向oc中对象的空指针 Nil:指向oc中类的空指针 NULL:指向其他类型的空指针,如一个c类型的内存指针
  • final 关键字可以用在 class,func 或者 var 前面进行修饰,表示不允许对该内容进行继承或者重写操作。
  • 为了降低程序的内存空间占用,Cocoa在程序开始处理事件之前创建一个自动释放池,并在事件处理结束后销毁自动释放池。这样可以使累积的临时对象的数量保持在最低程度
  • UITableViewCell有个NSString* reuseIdentifier属性,可以在初始化UITableViewCell的时候传入一个特定的字符串标识来设置reuseIdentifier(一般用UITableViewCell的类名)。当UITableView要求dataSource返回UITableViewCell时,先通过一个字符串标识到对象池中查找对应类型的UITableViewCell对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化一个UITableViewCell对象
  • Cocoa采用了一种称为引用计数的技术,有时也叫做保留计数。每个对象有一个与之相关联的整数,称作它的引用计数器或保留计数器。当某段代码需要访问一个对象时,该代码将该对象的保留计数器值加1,表示“我要访问该对象”。当这段代码结束对象访问时,将对象的保留计数器值减1,表示它不再访问该对象。当保留计数器值为0时,表示不再有代码访问该对象了,因此对象将被销毁,其占用的内存被系统回收以便重用。
  • TableView自带滑动删除功能,只要实现代理的方法tableView:commitEditingStyle:forRowAtIndexPath:方法即可,在方法中做数据的操作,刷新表格就行。
  • 刷新表格有两种方法: tableView:reloadRowsAtIndexPath:该方法使用前提是模型数据与tableView的行数要求一致。 tableView:deleteRowsAtIndexPath:该方法使用前提是模型数据删除的个数和表格删掉的行数要一致。
  • UITabBarConroller子控件的声明周期: 第一个子控件加载完毕,即将显示,显示完毕。 第二个子控件加载完毕,即将显示,第一个子控件即将消失,第一个子控件消失完毕,第二个子控件显示完毕。
  • 程序载入时会执行didFinishLaunchingWithOptions:方法,然后调用applicationDidBecomeActive:,之后如果按Home键进入后台,程序会先调用applicationWillResignActive:,然后执行applicationDidEnterBackground:方法。如果重新进入前台,则会调用applicationWillEnterBackground:方法,之后是applicationDidBecomeActive方法。
  • CAGradientLayer是一种特殊的层,用于渲染渐变效果。它继承自CALayer,可使用CALayer所有的属性,是除了在图形上下文绘制渐变效果外的另一种方法,它不需要借助图形上下文,是直接渲染在层上的,因此易于使用。
  • CAShapeLayer需要和贝塞尔曲线配合使用才有意义,贝塞尔曲线为其提供渲染的图形,可以实现不再view的drawRect方法中画出一些想要的图形。
    在drawRect中绘制图形调用CoreGraphics框架中的方法,占用CPU,消耗性能大;而CAShapeLayer属于CoreAnimation框架,通过GPU来渲染图形,节省性能。动画渲染直接提交给GPU,不消耗内存。
  • 目前所有iphone机型共有5种屏幕(竖屏):
    1. Retina1x(320*480)(iphone3GS之前,现已不用搭理)
    2. Retina2x(640*960)(iphone4/4s)
    3. Retina4(640*1136)(iphone5/5s/5c)
    4. Retina HD4.7(750*1334)(iphone6/6s)
    5. Retina HD5.5(1242*2208)(iphone6p/6sp)
  • 点用来构建一个坐标系,它是根据实际情况和需求制定的,是人为设想的,并不是真实存在的。在ios开发中,坐标系的单位长度就是点。在iphone3GS上,一个点包含一个像素,这种屏幕俗称一倍屏;iphone4、4s、iphone5等2倍retina屏上,一个点包含两个像素(这里说的是一维的长度),也就是二倍屏,用@2x表示这种屏幕模式;对于3倍retina的iphone6p和iphone6sp,一个点包含3个像素。开发中在通过点搭建的坐标系中布局界面,方便适配,因为无需再去理会屏幕的分辨率,系统会在显示的时候自动进行适配。
  • 启动图片更大的职能其实是在图片显示期间做一些初始化处理,其中包括检查适配情况。系统识别适配的方法同样是根据是否设置了相应屏幕的启动图来判断。