Objective-C基础教程 小结

这本书是看的第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,使用array objectEnumerator获取一个迭代器,如果想要从后向前浏览集合,还有一个方法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的一类(first class)成员。通过这些桥梁,可以使用python或者ruby设置cocoa子类对象,从而使用cocoa的所有特性。

– [EOF] –

3 comments:

Leave a Reply

Your email address will not be published. Required fields are marked *