随笔分类 -  iOS 开发

摘要:使用 @synchronized() 来标明一个同步的方法。实现同步的方式与其它语言类型,使用一个互斥锁,锁定对象决定了锁定范围的大小,比如锁定实例对象只对当前实例生效,锁定类对象对所有实例生效。当同步方法中的代码抛出异常时,运行时会解锁,让下面等待代码执行此同步方法... 阅读全文

posted @ 2011-08-19 09:32 沙加 阅读(727) 评论(0) 推荐(0)

摘要:Object-C 提供类似 Java / C++风格的错误处理模型,当使用 -fobjc-exceptions 开关(gcc > 3.3)时,它可以工作,但是只限于 OS X v10.3 以后的版本,之前的版本并不提供这一支持。使用错误捕获的原则与其它语言类似:你不能用它来当作正常的处理流的判断条件,而把它仅仅当作“意外”可以使用多个 @catch 块来捕获不同的错误类型。Cup *cup = [[Cup alloc] init];@try { [cup fill];}@catch (NSException *exception) { NSLog(@"main: Caught 阅读全文

posted @ 2011-08-19 09:26 沙加 阅读(446) 评论(0) 推荐(0)

摘要:在 object-c 中,selector 包含两种意义:在源文件中,它指向一个方法调用,在编译后它指向一个 unque indentifier。编译后的 selector 的类型为 SEL,同名的方法的选择器也相同。使用 selector 来调用object 方法是 Cocoa 框架 "目标-动作" 编程模型的基础。可以使用 @selector 来为 selector 创建一个别名:SEL setWidthHeight;setWidthHeight = @selector(setWidth:height:);在编译时用别名方法引用 seletor 不会对性能造成大的影响。 阅读全文

posted @ 2011-08-19 09:00 沙加 阅读(1254) 评论(0) 推荐(0)

摘要:默认的动态行为:对象是动态类型推断的只有在运行时才分配内存消息是动态绑定的,对象只能执行它所理解的消息”方法调用“虽然动态执行让程序变得灵活,但是也少了编译时的类型检查,你可以使用静态类型来进行编译时检查。Rectangle *thisObject = [[Square alloc] init];象这样指定类型,基本上只影响到编译时的检查,其它的行为跟 typed as id 是一样的。好处;1。 静态类型检查2。显式的方法参数类型与返回值。3。允许你使用 structure pointer 直接访问对象的实例变量。使用静态类型后,如果一个对象没有响应一个它应该响应的消息,那么会报错把一个静态 阅读全文

posted @ 2011-08-17 15:49 沙加 阅读(418) 评论(0) 推荐(0)

摘要:快速枚举使用的语法:for ( TypenewVariable in expression ) { statements }orTypeexistingItem;for ( existingItem in expression ) { statements }枚举期间对象不能被改变。使用快速枚举的三个类:NSArray, NSDictionary, NSSet如何使用:NSArray *array = [NSArray arrayWithObjects: @"One", @"Two", @"Three", @"Four&qu 阅读全文

posted @ 2011-08-17 15:27 沙加 阅读(1743) 评论(0) 推荐(0)

摘要:上一章讲了对类的方法进行扩展, 相关引用就是为现存的 class 增加另外的实例可引用变量(通常是一个静态变量),这个功能只在 iOS and OS X v10.6 以后提供。引入这种机制的原因类同于类的方法扩展。static char overviewKey;NSArray *array = [[NSArray alloc] initWithObjects:@"One", @"Two", @"Three", nil];// For the purposes of illustration, use initWithFormat: t 阅读全文

posted @ 2011-08-17 15:08 沙加 阅读(396) 评论(0) 推荐(0)

摘要:category 下称类别允许你甚至在没有类源码的情况下扩展一个类的功能,给它增加方法。** 这个可以理解为 "mixin" 的一种机制。主要作用是使相同的方法在没有继承关的类中复用。要使用它需要在类的@interface 文件中的category 处指名方法的名并在对应的实现文件中编写代码。但是不能使用 category 为类添加新的实例变量。category 只是一种编译时手段,定义在里面的方法与类的实例方法在运行时没有任何的不同。#import "ClassName.h"@interface ClassName ( CategoryName )// 阅读全文

posted @ 2011-08-17 14:49 沙加 阅读(2716) 评论(0) 推荐(0)

摘要:本节讨论了如何使用申明属性与系统内部实际使用了自动生成的方法用作属性访问的接口,由此引入的实例变量管理等等问题。使用申明属性 declared properties 可以方便地实现访问器方法 accessor methods.申明属性为访问器方法行为提供一种清晰,明确的规范。编译器帮你将申请属性扩展为访问器方法实现以短减你书写的代码量。申明属性也是一类标识符并且有自己的作用域,因此编译器可以探测到未申明的属性。语法:@property(attributes) type name;例如:@interface MyClass : NSObject{ float value;}@property f 阅读全文

posted @ 2011-08-16 21:48 沙加 阅读(464) 评论(0) 推荐(0)

摘要:**以下内容中 interface 指代传统意义上的接口, 而@interface 指代 Objective-C 中的类型规范概念,以免混乱。看到这一章,有点奇怪,其实只要将 protocal 当作 C# 里面的接口来认识就好了。因为 Objective-C 给每个 Class 都分配了一个 @interface ,因此用这人概念来表达 interface 的意思。抽象出接口的目的:1. 相似方法组的实现有共同的规范。2. 让“接口”独立于类。3. 封装没有继承关系的类的共性。if ( [assistant respondsToSelector:@selector(helpOut:)] ) { 阅读全文

posted @ 2011-08-14 23:09 沙加 阅读(873) 评论(0) 推荐(0)

摘要:创建一个对象需要丙步:1. 动态为新对象分配内存。2. 将新分配的内存与相关的值产生关联。直到这两步都做完,对象创建过程才算全部完成,虽然是两个步聚,但是在编写代码的时候通常使用一行代码来完成:id anObject = [[Rectangle alloc] init];分离这两个步骤给我们更多的选择择。基对象 NSObject 中的 alloc 和 allocWithZone 方法提供两种分配方式 。这两个方法一般不需要在子类中覆写。它们为成员变量分配足够的内存以供使用。具体的步骤:1. 初始化一个 isa 实例并指向 class object. 2. 将其它成员变量置为零。对象还需要进行进 阅读全文

posted @ 2011-08-14 19:18 沙加 阅读(911) 评论(0) 推荐(0)

摘要:关于类的定义:编译器虽然不强制,但是类型的接口申明与实现代码最好放在两个不同的文件中,以方便使用这些类的开发人员查看。实现的文件使用 .m 结尾。接口文件可以使用任何其它的扩展名。因为它经常被 included 到其它的文件中,因此通常使用 .h 的扩展名。分离接口与实现是面向对象设计方法中推荐的做法。@interface ClassName : ItsSuperclass{ instance variable declarations}method declarations@end接口定义开始于 @interface ,结束于 @end静态方法使用 + 开头,实例方法使用 - 号开头,如:+ 阅读全文

posted @ 2011-08-13 14:17 沙加 阅读(412) 评论(0) 推荐(0)

摘要:这个系列的内容与官方文档 Objective-C 语言介绍的内容一一对应,总共分为以下几个部分:对象、类型、消息定义一个类为对象分配内存并初始化协议属性申明分类与扩展相关引用快速枚举实现静态行为选择器错误处理线程总体说来 Objective-C 与主流面向对象的语言如C#, java 有许多共通之处,其核心是建立在C上的一套动态运行时系统,它帮助程序实现动态类型推定,垃圾回收等任务。类似于 IronPython 这种用静态语言去做了一个动态的运行时。以下是第一部分笔记:一种面向对象的语言一个对象库一套开发工具一个运行时在实例对象中,变量是私有的,如果需要访问则需要提供一个专用访问方法。对象的 阅读全文

posted @ 2011-08-13 11:33 沙加 阅读(593) 评论(0) 推荐(0)

导航