类扩展和头文件究竟是什么?有什么区别?在头文件中声明属性/方法与在类扩展中声明属性/方法之间的区别是什么。我对Objective-c完全不熟悉,所以初学者术语将是有益的:)
提前致谢!
答案 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。