1.Objective-C的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式是用继承好,还是用分类好,为什么?
答案:
Objective-C的类不支持多继承。可以实现多可接口(协议)。
Category是Objective-C的类别,是一种为现有的类添加新方法的方式。
重写一个类的方式用继承好。(1)使用继承可以定义一个具有父类所有功能的新类,它继承了父类的这些功能,当与父类功能有所不同时候,可以在子类中将其覆盖。(2)类别中无法向类中添加新的实例变量,类别没有位置容纳实例变量。
说明:
类别有两个方面的局限性:第一,无法向类中添加新的实例变量。类别没有位置容纳实例变量。第二,命名冲突,即类别中的方法与现有的方法重名。当发生命名冲突时,类别具有更高的优先级。你的类别方法将完全取代初始方法,从而无法再使用初始化方法。有些编程人员再自己的类别方法中增加一个前缀,以确保不发生命名冲突。
类别的作用:Cocoa中的类别主要用于3个目的:将类的实现分散到多个不同文件或多个不同框架中,创建对私有方法的前向引用,以及向对象添加非正式协议。
2.#import与#include有什么区别?#import <> 与 #import "" 又有什么区别?
答案:
C语言使用#include语句通知编译器应在头文件中查询定义。在Objective-C程序中也可以使用#include来实现这个目的。#import是GCC编译器提供的,Xcode在编译Objective-C、和C++程序时候都会使用它。#import可以保证头文件只被包含一次,而不论此命令实际上在那个文件中出现多少次。一般来说,在导入Objective-C头文件的时候使用#import,在包含C头文件时使用#include。
#import "" 指示预处理程序在一个或者多个文件目录(通常首先在包含源文件的目录中查找,但是通过修改适当的“项目设置”,可以用Xcode指定预处理程序搜索的确切位置)中寻找指定文件。
#import <> 将导致预处理程序只在特殊的“system”头文件目录中寻找包含文件,当前目录不会被搜索,同样,使用Xcode可以通过修改菜单中选择“项目”、“编辑项目设置”来更改这些目录。
#import <Foundation/Foundation.h>语句告诉编译器查看Fondation框架中的Foundation.h头文件。
3.类变量的@protected,@private,@public,@package声明各有什么含义?
答案:
@protected —Methods defined in the class and any subclasses can directly access the instance variables that follow.This is the default case.
该类和所有的子类中的方法可以直接访问这样的变量,这是默认的。
@private —Methods defined in the class can directly access the instance variables that follow, but subclasses cannot.
该类中的方法可以访问这样的变量,子类不可以。
@public —Methods defined in the class and any other classes or modules can di- rectly access the instance variables that follow.
除了自己和子类中的方法外,也可以被其他类或者其他模块中的方法所访问。开放性最大。
@package —For 64-bit images, the instance variable can be accessed anywhere within the image that implements the class.
对于64位图像,这样的成员变量可以在实现这个类的图像中随意访问。
4.id声明的对象有什么特性?
答案:
id是任意对象类型的,不能表示基本对象类型。id类型是通用指针类型,因为通过指针,也就是内存地址来引用对象,所以可以自由地将它们在id变量之间来回赋值。因此,返回id类型值的方法是返回指向内存中某对象的指针。然后可以将该值赋给任何对象变量。因为无论在哪里,对象总是携带它的isa成员。所以即使将它存储在id类型的通用对象变量中,也总是可以确定它的类。