iOS笔试题目解析:头文件导入、属性与类型转换

需积分: 9 12 下载量 104 浏览量 更新于2024-09-12 收藏 100KB DOCX 举报
“iOS笔试题相关的知识点,包括#import与#include的区别,@class的使用,属性关键字的作用,以及Objective-C中setter方法的实现,还有编译时和运行时类型的区分,以及Objective-C与C语言数据类型的不同。” 在iOS笔试题中,常常会涉及到Objective-C语言的基础概念。`#import`和`#include`都是预处理器指令,用于引入头文件。但`#import`比`#include`更智能,它可以避免重复导入同一文件,这在大型项目中能有效防止编译错误。另外,`#import<>`通常用于导入系统库文件,而`#import""`则用于导入自定义的头文件。 `@class`是一个关键字,它用于在不引入整个头文件的情况下声明一个类。这在头文件互相引用时很有用,可以防止循环包含问题。例如,如果你在A.h中需要引用B类,但在A.m中已经包含了B.h,你可以在A.h中使用`@class B`,而不是`#import "B.h"`。 Objective-C中的属性关键字有多种,如`readwrite`、`readonly`、`assign`、`retain`、`copy`和`nonatomic`。`readwrite`默认设置,生成getter和setter方法;`readonly`只生成getter;`assign`适用于基本数据类型,setter只是简单赋值;`retain`用于OC对象,setter执行`release`旧值后再`retain`新值;`copy`常用于`NSString`和`block`,setter会`release`旧值并`copy`新值;`nonatomic`表示非原子性操作,不加锁,提高性能。 对于setter方法的实现,对于`nonatomic,retain`的属性,如`name`,你需要释放旧的`_name`,然后`retain`新的`name`。而对于`nonatomic,copy`的属性,需要先`release`旧的`_name`,然后`copy`新的`name`,确保了对象的副本被正确持有。 在语句`NSString*obj=[[NSData alloc] init];`中,编译时类型为`NSString`,因为这是变量声明的类型。然而,运行时实际创建的是`NSData`类型的实例,这是因为`alloc`和`init`是基于`NSData`的,所以运行时的类型取决于实际的对象。 Objective-C中常见的数据类型包括`NSString`、`NSArray`、`NSDictionary`等,它们都是面向对象的,提供了丰富的功能和安全特性。相比C语言的基本数据类型(如`int`、`float`、`char`),Objective-C的这些数据类型提供了更高级的抽象,能够处理字符串、集合等复杂数据结构,同时也支持方法调用和动态绑定,增加了编程的灵活性和安全性。