Object-C疑问解答
### Object-C疑问解答#### 1.关于本FAQ **1.1我在哪里可以找到本FAQ的最新版本?**本FAQ的最新版本可以在以下位置找到: - comp.lang.objective-c新闻组- comp.answers和news.answers新闻组-在ftp://rtfm.mit.edu/pub/faqs/computer-lang/Objective-C/faq下载。 #### 2. Objective-C编译器指令**2.1 Objective-C源程序的文件后缀是什么?** Objective-C实现文件(implementation file)的后缀是`.m`,头文件的后缀是`.h`。Objective-C编译器通常也接受`.c`作为后缀,但会把这些文件按照普通的C语言模式进行编译。 **2.2如何使用Stepstone编译器编译.m文件?**使用Stepstone编译器编译`.m`文件的方法如下: ``` objcc -cclass.m objcc -oclass.o ```更多信息,请参考[http://www.stepstn.com](http://www.stepstn.com)。 **2.3如何使用苹果编译器编译.m文件?**使用苹果编译器编译`.m`文件的方法如下: ``` cc -cclass.m cc -oclass.o ```更多信息,请参考[http://www.apple.com](http://www.apple.com)。 **2.4如何使用GNUCC编译器编译.m文件?**使用GNUCC编译器编译`.m`文件的方法如下: ``` gcc -cclass.m gcc -oclass.o -lobjc -lpthread ``` **2.5如何使用POC编译器编译.m文件?**使用POC编译器编译`.m`文件的具体方法未提供,请参照相关文档或官网指南。 #### 3. Objective-C预处理器指令**3.1注释语句的语法是什么?** Objective-C中的注释语法与C语言相同,有两种方式: 1. `//`开始直到行尾都是单行注释。 2. `/* */`之间的内容为多行注释。 **3.2如何包含根目录?** Objective-C使用`#import`或`#include`来包含其他头文件。如果是首次引入头文件,则推荐使用`#import`。 **3.3什么是#import?** `#import`是Objective-C的预处理器指令,用于包含其他头文件。与`#include`相比,`#import`能确保每个头文件仅被包含一次,避免重复定义。 **3.4为什么教我使用#import?**使用`#import`可以避免因多次包含同一个头文件而引起的重复定义错误。这有助于提高代码的可读性和可维护性。 #### 4.对象的数据类型(id) **4.1什么是id?** `id`是Objective-C中的一个类型,表示任何对象。它是所有类的共同基类型,可以用来声明指向任何类实例的指针。 **4.2 self和super有什么区别?** - `self`是当前对象的引用,用于调用当前类中的方法。 - `super`是父类的引用,用于调用超类中的方法。 **4.3什么是@defs()?** `@defs()`并不是标准Objective-C的一部分,在提供的文档中没有详细解释该指令的作用。可能是特定编译器或框架的扩展特性。 #### 5.消息发送器(SEL) **5.1什么是SEL?** `SEL`是Objective-C中的消息标识符类型,用于唯一标识一个方法。 **5.2 perform:有什么用途?** `perform:`方法允许您向对象发送一个指定的选择符(SEL),用于动态调用方法。 **5.3我如何知道特定method的SEL?**可以通过`@selector`宏来获取方法的选择符(SEL)。例如,`@selector(methodName)`。 #### 6.方法指针(IMP) **6.1什么是IMP?** `IMP`是Objective-C中的方法指针类型,指向实际执行方法的函数。 **6.2如何通过指定的SEL获取IMP?**可以使用`class_getMethodImplementation`函数来获取方法的IMP。 **6.3如何通过指定的IMP发送消息?**可以通过`objc_msgSend`函数来实现。 **6.4如何将IMP用于返回双精度浮点数的方法?**对于返回双精度浮点数的方法,可以使用特定的`objc_msgSend`变体。 **6.5对于返回双精度浮点数的方法,可以使用perform:吗?**通常情况下,`perform:`不支持直接处理返回值类型,尤其是非默认类型如双精度浮点数。需要通过其他方式如IMP来处理。 #### 7.复制对象**7.1 copy和deepcopy有什么区别?** - `copy`:浅复制,只复制对象本身,不复制其内部引用的对象。 - `deepcopy`:深复制,不仅复制对象本身,还包括其内部引用的所有对象。 #### 8. Objective-C和C++**8.1如何将一个C++类链接到Objective-C程序中?**可以通过桥接头文件(.mm文件)将C++类与Objective-C程序链接起来。这样可以在Objective-C代码中使用C++类。 #### 9.消息**9.1如何生成一个静态的方法?** Objective-C不支持真正的静态方法,但可以通过类方法来实现类似功能。 **9.2如何阻止一个对象发送某个消息?**可以通过`NSAssert`或`NSCAssertionHandler`断言来检查条件并阻止消息的发送。 **9.3如果我更改了一个方法的实现,如何让所有代码重新编译?**修改方法实现后,需要重新编译整个项目或受影响的部分。可以使用`clean`命令清理构建缓存,然后重新编译整个项目。 #### 10.实例和类变量**10.1如果我对一个类的实例变量进行了修改,我是否需要对所有代码重新编译?**修改实例变量不会影响编译过程,但如果修改了类变量,并且这些修改会影响到其他类或方法的行为,那么可能需要重新编译相关的代码。 #### 11. Objective-C和X-Windows **11.1如何将XIntrinsic头文件包含到Objective-C文件中?**可以通过`#include`或`#import`来包含XIntrinsic的头文件。 #### 12. Stepstone编译器特有的特性**12.1如何在运行时分配对象?** Stepstone编译器可能提供了特殊的运行时分配对象的方式,具体方法需要查阅相关文档。 #### 13. GNU Objective-C编译器特有的特性**13.1为什么我会得到一个“浮点例外”错误?** “浮点例外”错误通常意味着在执行浮点运算时发生了异常,例如除以零或使用了未初始化的浮点变量。 #### 14.苹果Objective-C编译器特有的特性**14.1字符串常量的格式是什么?** Objective-C中的字符串常量通常采用`@"string"`的格式。 **14.2如何将C++类与Objective-C程序链接?**可以使用桥接头文件(.mm文件)将C++类与Objective-C程序链接起来。 #### 15.可移植对象编译器(POC)特有的特性**15.1类变量的语法是什么?**在POC中,类变量的声明和使用与其他Objective-C编译器基本相同。 **15.2如何发送消息?** POC中发送消息的方式与其他Objective-C编译器基本一致,可以使用`objc_msgSend`或`perform:`方法。 **15.3如何将C++类与Objective-C程序链接?**同样使用桥接头文件(.mm文件)将C++类与Objective-C程序链接起来。 #### 16.文献和进一步阅读资料**16.1 Object-Oriented Programming: An Evolutionary Approach, 2nd Ed.** **16.2 An Introduction to Object-Oriented Programming, 2nd Ed.** **16.3 Objective-C: Object-Oriented Programming Techniques** **16.4 Applications of Object-Oriented Programming; C++SmallTalk Actor Objective-C Object Pascal**以上书籍提供了更多关于面向对象编程以及Objective-C的深入理解和技术细节。建议结合实践和项目经验来学习这些资料,以便更好地掌握Objective-C。
441.07KB
文件大小:
评论区