这本书是看的第2遍了,再写了一些iphone应用程序后,再看这本书很都都游刃有余了。作为iphone-dev分享计划的一步,再把这本小结一下。下一步是整理Stanford的那个iphone iTune U教程。
对C的扩展:
- Obj-C只是增加了一点“特殊语料”的C语言,所以可以用printf()代替NSLog()。但我们建议使用NSLog,因为它添加了特性,例如时间戳,日期戳和自动附加换行符(‘\n’)等。
- 使用NSLog()输出任意对象的值时,都会使用%@格式说明。在使用这个说明符时,对象通过一个名为description的方法提供自己的NSLog()格式。
面向对象编程基础知识:
- id是一种泛型,用于表示任何种类的对象。id实际上是一个指针,指向其中的某个结构。
- obj-c编程风格建议开发人员使用首字母大写的类名。引用对象的obj-c变量通常不需要首字母大写。
- 在obj-c中只要看到@符号,你都可以把它看成是c语言的扩展。
- @implementatiion是一个编译器指令,表明你将为某个类提供代码。类的实现方法不必按照@interface指令中的顺序出现。你甚至可以在@implementation中定义那些在@interface中无相应声明的方法。可以把它们看成是私有方法,仅在类的实现中使用。
- 你也许认为,既然单独在@implementation指令中定义方法,就不能从该实现之外访问该方法。但事实并非如此,Objctive-C中不存在真正的私有方法。也无法把某个方法标识为私有方法,从而禁止其他代码调用它。这是obj-c动态本质的副作用。
继承:
- obj-c不支持多继承。如果你尝试在obj-c中使用多继承(多继承的形式可能类似于以下语句),编译器将不能正常识别它们:@interface Circle : NSObject, PrintableObject
- super既不是参数也不是实例变量,而是由obj-c编译器提供的某种神奇功能。向super发送消息时,实际上是在请求obj-c向该类的超类发送消息。如果超类中没有定义该消息,obj-c将按照通常的方式在继承链中继续查找对应的消息。
复合:
- getter方法则仅仅根据其返回的属性的名称来命名。不要将get用做getter方法的前缀。get这个词在Cocoa中有着特殊的含义。如果get出现在Cocoa的方法名称中,就意味着这个方法会通过你当作参数传入的指针来返回数值。例如NSData中有一个getBytes:的方法,它的参数就是用来存储字节的内存缓冲区的地址。
XCode:
- 选择File > Make Snapshot (command + control +S),Xcode会记住项目当前的状态。现在你就可以放心地编辑源文件,可以随心所欲的“破坏”的项目。如果你意识到犯了一个严重的错误,可以通过File > Snapshot 打开快照窗口,这样就可以从前一个快照恢复项目了。在你做任何冒险的事情之前最好先创建一个快照。
- 打开“研究助手”,选择help > show research assitant。
- 如果想直接访问苹果公司的官方API文档,最快的方法是按住option键并双击某个符号,这是查找该符号相关文档的快捷方式。
- 快捷键:
- Command + Shift + E :扩展编辑器
- Command + [ :左移代码块
- Command + ] :右移代码块
- Tab :接受代码提示
- Esc :显示代码提示菜单
- Ctrl + . (句点):循环浏览代码提示
- Shift + Ctrl + . (句点):反向循环浏览代码提示
- Ctrl + / :移动到代码提示中的下一个占位符
- Command + Ctrl + S :创建快照
- Ctrl + F :前移光标
- Ctrl + B :后移光标
- Ctrl + P :移动光标到上一行
- Ctrl + N:移动光标到下一行
- Ctrl + A : 移动光标到本行行首
- Ctrl + E : 移动光标到本行行尾
- Ctrl + T :交换光标左右两边的字符
- Ctrl + D:删除光标右边的字符
- Ctrl + K :删除本行
- Ctrl + L : 将插入点置于窗口正中
- Command + Alt + D:显示open quickly 窗口
- Command + Alt + 上方向键 :打开配套文件
- Command + D :添加书签
- Option + 双击:在文档中搜索
- Command + Y :以调试方式运行程序
- Command + Alt + P : 继续(在调试中)
- Command + Alt + 0 :跳过
- Command + Alt + I :跳入
- Command + Alt + T :跳出
Foundation Kit:
- NSString的length方法能准确无误的处理国际字符串,如含有中文或者日文字符的字符串,以及使用Unicode国际字符标准的字符串。
- NSString的hasPrefix和hasSuffix方法。
- NSEnumerator,使用arrayobjectEnumerator获取一个迭代器,如果想要从后向前浏览集合,还有一个方法reverseObjectEnumerator可以使用。在获得枚举器之后,可以开始一个while循环,每次循环都向这个枚举器请求它的nextObject。nextObject返回nil时,循环结束。这也是不能在数组中存储nil值的另一个原因。我们没有办法判断nil是存储在数组中的数值还是代表循环结束的标志。
- 你可能很有创造力,试图去创建NSString,NSArray或者NSDictionary的子类。请不要这么做,在一些语言中,你确实会用到字符串和数组的子类来完成工作。但是在Cocoa中,许多类实际上是以类簇的方式实现的,即它们是一群隐藏在通用接口之下的与实现相关的类。创建NSString对象时,实际上获得的可能是NSLiteralString,NSCFString,NSSimpleString,NSBallofString或者其他未写入文档的与实现相关的对象。
- 有时确实你需要存储一个表示“这里什么都没有”的值,可以使用[ NSNull null ]
内存管理:
- 要获得保留计数器的当前值,可以发送retainCount消息。
- 9.1.3中的例子是和很好的讲内存引用计数的例子。
- 创建一个自动释放池时,该池自动成为活动的池。释放该池时,其保留计数器值归0,然后该池被销毁。在销毁过程中,该池释放其包含的所有对象。
- 除了release,你可能见过另一种销毁自动释放池中对象的方式:-drain方法。该方法只是清空自动释放池而不销毁它。-drain方法只适用于Mac OSX 10.4及更高的版本。在我们自己编写的代码中,我们使用release方法,因为该方法适用于Mac OS的所有版本。
- 自动释放池以栈的形式实现:当你创建一个新的自动释放池时,它将被添加到栈顶。接收autorelease消息的对象将被放入最顶端的自动释放池中。
- 如果开发iphone软件,则不能使用垃圾回收。实际上,在编写iphone程序时,苹果公司建议你不要在自己的代码中使用autorelease方法,同时还要避免创建自动释放对象的便利函数。
特性:
- 可以使用一些其他的声明(如nonatomic),如果不在多线程环境中使用,这些声明可以提高访问器方法的调用速度。台式机的速度已经够快了,因此通过创建特性的nonatomic声明对于性能的提升实际上不起什么作用,但是iphone开发人员经常使用这种技术在资源有限的设备上获得更好的性能。如果不希望保留属性的对象,你可以使用assign方法以避免保留周期问题。
- 在dealloc方法中,我们采用一种高明的技巧:self.name = nil;这行代码表示使用nil参数调用setName:方法。生成的访问器方法将自动释放以前的name对象,并使用nil替代name。该方法完成了释放name对象所占用内存的操作。当然,也可以只释放name对象以清理其占用的内存。如果你在dealloc方法以外的地方清除特性,那么使用“将nil赋值给对象”的方法可以将特性设置为nil,同时可以使我们避免对已释放内存的悬空引用问题。
类别:
- 类别的局限性:1,无法向类中添加新的实例变量。类别没有位置容纳实例变量;2,名称冲突,即类别中的方法与现有的方法重名。当发生名称冲突的时候,类别具有更高的优先级。你的类别方法将完全取代初始方法,从而无法再使用初始方法。
其他:
- 可以使用[ NSDate date ]获取当前的日期和时间,它是一个自动释放对象。+dateWithTimeIntervalSinceNow: 接受一个NSTimeInterval参数,该参数是一个双精度值,表示以秒为单位的时间间隔。
- 有些属性列表文件是以压缩的二进制格式存储的。通过使用plutil命令:plutil -convert xml1 filename.plist ,可以将这些文件转换成人们可读的形式。
- -writeToFile:atomically: 方法,可用于写入文件。atomically:参数的值为BOOL类型,用于通知Cocoa是否应该首先将文件内容保存在临时文件中,当文件成功保存后,再将该临时文件和原始文件交换。这是一种安全机制:如果在保存过程中出现意外,不会破坏原始文件。但这种安全机制要付出一定的代价:在保存过程中,由于原始文件仍然保存在磁盘中,所以需要使用双倍的磁盘空间。
- 使用脚本语言作为桥梁,可以获取脚本语言和obj-c两家之长。通过在obj-c和python之间(成为PyObjC),以及obj-c和Ruby之间(称为RubyObjC)搭建桥梁,这两种脚本语言能够成为obj-c的一类(firstclass)成员。通过这些桥梁,可以使用python或者ruby设置cocoa子类对象,从而使用cocoa的所有特性。
转自: http://web2.0coder.com