4委托与Corelocation

委托delegation和core location框架 

委托是一种面向对象的回调callsback机制

项目是一个文件,包含一组指向其他文件的引用(源代码、资源、框架、库)。

任何一个项目,至少都会有一个target,Xcode可以针对某个target,使用项目中的文件来构建一个特定的产品。使用xcode构建并运行应用时,真正构建并运行的是目标,而不是项目。通常情况下,目标所构建的产品就是应用,但也可以是编译后的库,或者是单元测试程序包unit test bundle。

Build Phases(构建阶段)

目标的构建阶段由一系列的步骤组成,在Xcode完成这些步骤后,就会生成相应的产品。

在构建阶段,创建iOS应用的关键步骤是Compile Sources(编译源代码)、link binary with libraries(连接二进制代码和库)和Copy Bundle Resource(拷贝程序包资源)。

框架是一组类的集合,且这些类互有关联。编写iOS应用时,可以将要使用的框架加入相应的目标,cocoa touch其实是一组框架的集合。

coreLocation

通过使用corelocation框架所包含的类,iOS应用可以获得设备的当前地理位置。

通过CLLocationManager类,应用可以访问设备的定位硬件

desiredAccuracy属性:

设置desiredAccuracy属性后,CLLocationManager实例会根据设置的数值在设备移动一定距离后再通知应用“设置的位置发生了变化”desiredAccuracy属性决定了CLLocationManager实例查询地点的精准度。定位越精确,要花费的时间越长,消耗的电量也越大,所以desiredAccuracy是一个特别重要的属性。

此外设备实际能够达到的精准度会依赖:用户所使用的设备、可用的基站、卫星以及可知的且可用的无线转入点。

当应用等待用户输入时,或者在更新界面时,并不会阻塞其他代码执行。CLLocationManager对象也有类似的特性,即向某个CLLocationManager对象发送startUpdatingLocation消息后,收到消息的对象会在后台处理相关的定位任务,不会阻塞应用。

//        创建CLLocationManager对象   

     locationManager = [[CLLocationManager alloc] init];

        [locationManager setDelegate:self];

//        不考虑会花费的时间和电力

        [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];

//        要求CLLocationManager对象立刻开始工作,定位设备位置

        [locationManager startUpdatingLocation];

委托

委托是面向对象的回调机制callbacks。传统意义上的回调是指在某个特定事件发生前就设置好的函数。当相应的事件发生时,程序就会调用该函数。

OC没有内建的机制能让两个或者多个回调函数协同工作并分享信息。委托解决了这个问题:单个委托对象可以接收针对某个特定对象的全部事件消息。该委托对象可以根据需要,保存、修改、使用和转发相关信息。

使用委托机制,只要设置一个委托对象,就可以向该对象发送不同的事件消息。委托对象要为其“关心”的每个事件实现相应的方法,对象只能向其委托对象发送一组特定协议所声明的消息。

协议protocol

凡是支持委托的对象,其背后都有一个相应的协议,声明可以向该对象的委托对象发送的消息。委托对象需要根据这个协议,为其感兴趣的事件实现相应的方法,如果某个类实现了某个协议的中的方法,就称这个类遵守该协议。

协议不是类,只是一组方法,不能为协议创建实例,或者添加实例变量,协议自身不实现方法,需要由遵守相应协议的类来实现。

用于委托的协议称为委托协议delegate protocols。委托协议的命名约定是,实施委托的类的类名,加上单词Delegate。

协议方法

- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager 是否需要方位校准heading calibration。

发送方在发送可选方法前,会先向其委托对象发送一个名为respondsToSelector:方法,该方法能在运行时检查对象是否实现指定的方法。@selector()指令可以将选择器selector转换成数值,以便将其作为参数进行传递。

如果某个协议方法是必需的,那么发送方可以直接向其委托对象发送相应的消息,不用检查委托对象是否实现了该方法,如果委托对象没有实现相应的方法,应用就会抛出未知选择器异常,导致应用崩溃。

委托控制对象和内存管理

当控制对象是某个对象的委托对象时,该控制对象通常会拥有这个对象A,A对象的delegate属性再指回控制对象@property(nonatomic,assign) id<UITextViewDelegate> delegate;

当两个或两个以上的对象相互之间有强引用特性的指针关联时,就会产生retain循环,delegate属性设置为assign

使用调试器using the debugger

切换调试器区域 继续执行  单步执行  跳入方法  跳出方法

可以让调试器为导致应用崩溃或引发异常的那行代码自动设置断点。(Add Exception Breakpoint…)

构建阶段  编译器错误  连接器错误

Xcode会分步骤构建应用,这些步骤称为构建阶段(build phases),需要完成以下任务:

编译源代码Compile sources :该阶段会编译构建目标所需要的源代码,凡是加入项目的源代码文件,默认都会加入该构建阶段。

连接二进制文件和库link binary with libraries:Xcode会将编译后的代码和指定的框架(库)连接起来,使代码能够使用相应框架中的类。

拷贝程序包资源Copy bundle resources:完成编译的代码和连接后,xcode会生成一个可执行文件,并将其放入应用程序包(程序包其实是一个目录)。接着,xcode会将指定的文件加入程序包。这些资源时运行应用时要使用的数据文件,例如xib文件,图片和声音文件,凡是加入项目的非源代码文件,默认都会加入该构建阶段。

编译源代码分为两步:预处理和编译

预处理:preprocessing

预处理是为每个实现文件(.m)创建一个中间文件intermediate file,中间文件和实现文件一样,都是oc代码。但中间文件的体积可能会很大。

预处理器处理完实现文件的所有预处理指令后,会生成一个中间文件。预处理指令是带有前缀#的语句,例如#import,预处理器在处理#import语句时,会将该语句替换成导入文件的内容。

编译:完成预处理步骤后,Xcode会在编译之前生成的中间文件,将oc代码转换成机器码。新生成的机器码会被保存在目标文件中,一个目标文件对应一个中间文件。

开发应用时,大部分错误会发生在这个将代码转换成机器码的编译阶段。这类在编译阶段产生的错误称为编译时错误compile-time errors或者语法错误。Com+4查看错误。

连接

目标文件包含在实现文件中实现的方法的机器码,但是某个实现文件A可能会用到其他实现文件B中的代码。此时编译器不是拷贝代码而是设置一个连接,指向实现文件B的目标文件。连接二进制文件和库就是处理这类连接的阶段,简称连接阶段。

框架是一组类的集合,而类由头文件和实现文件两个文件定义。框架的特别之处就是框架的实现文件是已经预编译好的,并且会将处理后的目标文件分为一个或者多个库文件(所以oc的框架没有实现文件,相应的实现文件已经转成机器码),凡是用到框架代码的类,编译器都会在其目标文件中放置相应的连接,指向库。

编译源代码(预处理-中间文件)(编译-目标文件-机器码)-连接(实现文件指向目标文件)(目标文件指向库)

如果编译器无法处理某个连接(例如无法找到包含相应代码的目标文件,或者目标文件没有包含被引用的代码)就会出现连接器错误linker error。

Xcode会将连接器错误列在名为link的条目下方,往往是因为没有为目标添加相应的框架。

posted @ 2015-09-16 11:35  captivity  阅读(63)  评论(0)    收藏  举报