类扩展与头文件

时间:2013-06-28 19:28:29

标签: ios objective-c header-files class-extensions

类扩展和头文件究竟是什么?有什么区别?在头文件中声明属性/方法与在类扩展中声明属性/方法之间的区别是什么。我对Objective-c完全不熟悉,所以初学者术语将是有益的:)

提前致谢!

3 个答案:

答案 0 :(得分:2)

顾名思义,他们扩展了课程。类继续是另一个名称。类扩展通常用于声明私有方法和属性。您希望类扩展名对@implementation可见,而不是在头文件中可见(即您希望类扩展名和@implementation位于MONClass.m中)。

头文件中的类型和方法通常是公开的 - 任何客户都可以使用。

示例:#import标题的客户端无法看到/扩展在类扩展中声明的属性,但@implementation可以使用该属性,因为@implementation可以看到类扩展的声明。

因此,这可用于模拟您的ivars和方法的受限访问。这很有用,因为ObjC方法和属性不能指定为private / protected / public(例如使用@public)。

类扩展与类别的不同主要是因为扩展可能会声明存储(例如,将生成支持ivars的属性)。

答案 1 :(得分:2)

标头文件(.h)是您在现有类中公开声明属性,方法和协议的地方。然后,您可以导入此文件,当然,也可以将其用于实施。

扩展程序是您的实施@interface文件中的另一个(.m)。这扩展了导入的头部的内部实现,添加了在某人或其他人导入与该类关联的头文件时不可用的方法。

有关详细信息,请查看Apple's documentation on customizing existing classes

答案 2 :(得分:1)

问: What exactly are ... header files
A:标头文件 - 是一个文件,其内容由编译器“插入”而不是#import...#include和其他类似指令)行。头文件包含公共代码:类,枚举,变量,函数和其他的前向声明。

问: What exactly are class extensions …
A: Class Extension - 是一种语言结构,允许您将接口扩展到类。

为了更好地理解它是什么,你必须了解什么是课程category
Category - 是一种语言结构,它允许您向现有类添加功能(仅限方法!)。即使没有子类化。
示例:
您可以向NSImage添加新方法:

@interface NSImage(YourExtensionName)
- (CGImageRef)CGImage;
@end

Class Extension(也称为类继续,或unnamed category)与类别有一些相似之处,但它只能添加到编译时拥有源代码的类中。
class extension中,您可以使用在常规@interface块中使用的相同内容。

问: What are difference A:头文件用于为程序包含一些能力(结构,数据类型,常量,函数等)。类扩展用于扩展具有某些功能的现有类。通常,class extension是类的私有接口。 class extension声明的功能在原始类的@implementation块中实现,因此您不能在框架类上声明类扩展,例如Cocoa或Cocoa Touch类,如NSString。

问: What is the difference between declaring a property/method in a header file vs in a class extension
A:如果在头文件中声明属性/方法,那么.h文件的任何用户都可以访问此属性/方法。类扩展用于为您的类声明私有接口。

强烈建议您阅读Apple的Objective-C Programming Guide