iOS小知识点一二三

1.  你是否注意到,默认情况下Upside Down方向是不被选中的?这是因为,如果iPhone倒置时来电,那么在接听电话时,手机仍然可能处于倒置状态。而iPad应用项目默认支持所有方向,因为在任何方向上都应该能够使用iPad。

2. 我们在应用的全局配置中指定应用所支持方向的绝对上限。如果全局配置不支持upside-down方向,那么任何一个视图控制器都不能迫使系统旋转到upside-down方向。在视图控制器能做的就是在可接受的范围内进一步限制。

3. 在iPad上,大部分基于导航的应用程序都是使用分割视图(split view)实现的,比如Mail(邮件)。在分割视图中,导航元素在屏幕左侧显示,被选中的项在右侧显示。

4.    在Cocoa Touch中,Foundation框架(包含适用于所有Objective-C编程类型的基本类,如NSString、NSArray等)通常被视为线程安全的。但是,UIKit框架(包含专门用于构建GUI应用程序的类,如UIApplication、UIView及其所有子类等)在很大程度上被视为非线程安全的。这意味着在一个运行的ios应用程序中,处理任何UIKit对象的所有方法调用都应从相同线程执行,该线程通常被称为主线程(main thread)。如果从另一个线程访问UIKit对象,那结果就不堪设想了!你可能会遇到一些莫名其妙的bug,更糟糕的是,你自己不会遇到任何问题,但发布之后一些用户却遭殃了。

      默认情况下,主线程执行iOS应用程序的所有操作(比如处理由用户事件触发的操作)。

     苹果公司推荐使用的解决方案中体现了这一理念:将长期运行的任务拆分为多个工作单元,并将这些单元添加到执行队列中。系统会为我们管理这些队列,为我们在多个线程上执行工作单元。我们不需要直接启动和管理后台,而可以从通常实现并发应用程序所涉及的太多“登记”工作中脱离出来,系统会为我们完成这些工作。

5. 如果进行过大量C编程,可能会发现这段代码类似于C中的函数指针概念。但是,它们之间存在一些重要区别。或许最大的区别(也是最明显的区别)就是,程序块可以在代码内部以内联的方式定义,可以在把代码块传递给另一个方法或函数的位置定义它。另一个比较大的区别就是,程序块可以访问在创建它的范围内可用的变量。默认情况下,程序块通过这种方式复制你访问的任何变量,保留原始变量不变。但我们可以在变量声明之前添加修饰符__block,进行外部变量“读写”。注意block前面有两条下划线,不是一条。

6.  calculateFirstResult:和calculateSecondResult:不需要顺序执行,并发执行可以显著的提高速度。

    幸而,GCD提供了一种途径来完成此任务:使用所谓的分派组(dispatch_group)。将在一个组的上下文中通过dispatch_group_async()函数异步分派的所有程序块设置为松散的,以尽可能快的执行。如果可能,将它们分发给多个线程来同时执行。也可以使用dispatch_group_notify()指定一个额外的程序块,让它在组中的所有程序块运行完成时再执行。

7.      iOS4中的另一项重要的功能是引进了后台处理,后台处理支持在后台运行应用程序,在一些情形下甚至可以在用户按下主屏幕按钮后还在后台运行。

        不要将此功能跟现代桌面系统提供的真正的多任务混淆。在桌面操作系统中无法启动的所有程序将保留在系统的RAM中,直到显示退出。iOS设备的RAM速度仍然太慢,无法胜任这一职责。不过,后台处理功能意味着需要特定系统功能的应用程序可以在受限方式下继续运行。例如,如果应用程序播放来自互联网广播站的音频流,iOS将允许该应用程序在用户切换到另一个应用程序时继续运行。除此之外,在应用程序播放音频时,iOS甚至还在iOS系统任务栏(当你双击主屏幕按钮时在底部显示的栏)上提供了标准的暂停和音量控件。

       应用程序可以在任意时间内处于不活动状态的唯一前提是,用户正在处理系统提示(比如显示的传入呼叫或者SMS提示)或用户锁定了屏幕。这基本上是一种中间过渡的状态。

8.   Objective-C提供了一个方便的内置变量,名为_cmd,它始终包含当前方法的选择器。NSStringFromSelector()函数返回给定的选择器的NSString表示。

9.     有时候应用程序仅仅使用UIKit内置组件无法完全实现,此时应用程序需要能够进行自定义绘图。幸而,我们可以依靠两个不同的库来满足绘图需求:

   1. Quartz 2D,它是Core Graphics框架的一部分;

   2. OpenGL ES,它是跨平台的图形库。

        OpenGL ES是跨平台图形库OpenGL的简化版,可以说是它的一个子集,是专门为iPhone、iPad和iPad touch之类的嵌入式系统(缩写字母为ES)设计的。2009年后发布的所有的iOS设备都支持OpenGL ES2.0,这是一个非常强大的更新,开发者可以通过可编程渲染管道使用硬件的绘图能力。相对于上一版本的OpenGL ES(使用固定渲染管道),这是一个巨大的变化。

        Quartz 2D是一组函数、数据类型以及对象,专门用于直接在内存中对视图和图像进行绘制。 Quartz 2D将正在进行绘制的视图或图像视为一个虚拟的画布,并遵循所谓的绘画者模型(painter's model)。之所以这么叫,是因为绘图命令的用法很像在画布上使用颜料的方式。

       OpenGL ES以状态机(state machine)的形式实现。这个概念可能有点不好理解,因为不能用在虚拟画布上绘画这样简单的比喻说清楚。OpenGL ES不允许执行直接影响视图、窗口或者图像的操作,它维护的是一个虚拟的三维世界。当你向这个世界添加对象时,OpenGL ES会跟踪所有对象的状态。

       虽然OpenGL ES没有提供虚拟画布,但它却提供了一个让你进入其世界的虚拟窗口。你可以向该世界中添加对象并定义虚拟窗口相对于该世界的位置。然后,OpenGL ES根据配置方式以及各种对象彼此相对的位置绘制视图,并通过该窗口呈现给用户。

       Quartz 2D提供了各种直线、形状以及图像绘制函数。虽然易于使用,但是Quartz 2D仅限于二维绘图。尽管许多Quartz 2D函数会在绘图时利用硬件加速,但我们无法保证你在Quartz 2D中执行的任何操作都会得到加速。

       OpenGL ES相对来说比较复杂,但是它是比Quartz 2D更强大的,这一点毫无疑问,它同时提供了二维和三维绘图工具;它经过了专门设计,能充分利用硬件加速;它还非常适合用于编写游戏和其他设计大量图形的复杂程序。       

10.     //CGRectUnion 用法
    /*
     CGRectUnion(rect1,rect2) 返回值是能够包含两个矩形的最小矩形
     unionResultRect.origin.x = min(rect1.origin.x, rect2.origin.x);
     unionResultRect.origin.y = min(rect1.origin.y, rect2.origin.y);
     unionResultRect.size.width = min(rect1.origin.y, rect2.origin.y);
     unionResultRect.size.height = min(rect1.origin.y, rect2.origin.y);
     */         

    // CGRectInset 用法
    CGRect insetRect = CGRectInset(originalRect, 1, 2);
    /*
     CGRectInset(originalRect, dx, dy);
    insetRect.origin.x = originalRect.origin.x + dx ;
    insetRect.origin.y = originalRect.origin.y + dy;
    insetRect.size.width = originalRect.size.width - 2 * dx;
    insetRect.size.height = originalRect.size.height - 2 * dy;
     */

11.   

      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值