Objective-C中Extension与Category的使用

Objective-C 2.0增加了class extensions用于解决两个问题:

  1. 允许一个对象可以拥有一个私有的interface,且可由编译器验证。
  2. 支持一个公有只读,私有可写的属性。

私有接口(Private Interface)

Objective-C 2.0以前, 若要定义私有函数,通常是在实现文件中声明一个"Private" category:

@interface MyClass (Private) 
 - (id)awesomePrivateMethod; 
@end

然而, 类的私用方法通常是希望实现在类的@implementation块中的,而不是像上面的Category的方法那样实现在独立的@implementation区块中。事实上,Category仅仅是弥补了Objective-C缺少public/private限定的不足。

真正的问题是Objective-C编译器会认为在Category中声明的方法将会在别处实现,所以编译器并不会尝试确认它们是不是真得都被实现了。也就是说,开发者声明的方法有可能并未实现,而且编译器也不会有什么警告。编译会以为它们将在别的地方或独立的文件中实现。

使用class exteionsion,在其中声明的方法和属性的实现将放在class的@implementation区块中。否则,编译器就会报错。

[cpp] view plaincopyprint?

  1. // someClass.m
  2. @interface someClass ()
  3. -(void)extend;
  4. @end
  5. @implementation someClass
  6. // 所有声明在头文件或父类中方法的实现
  7. // 或者一些私有函数
  8. -(void)extend {
  9. // implement private method here;
  10. }
  11. @end

公有可读、私有可写的属性(Publicly-Readable, Privately-Writeable Properties)

实现一个不可变(immutable)的数据结构通常有一个好处是外部代码不能用setter修改对象的状态。然而,可能又希望它在内部又是一个可写的属性。Class extensions可以做到这一点:在公共接口(类的声明中)中,开发者可以声明一个属性是只读的,随后在类扩展中声明为可写。这样,对外部代码而言,该属性将是只读的,而内部代码却可以使用它setter方法。

[cpp] view plaincopyprint?

  1. @interface MyClass : NSObject
  2. @property (retain, readonly) float value;
  3. @end
  4. // 私有的extension, 隐藏在主实现文件中.
  5. @interface MyClass ()
  6. @property (retain, readwrite) float value;
  7. @end

看起来相似,其实不同

Class extension常常被误解为一个匿名的category。它们的语法的确很相似。虽然都可以用来为一个现有的类添加方法和属性,但它们的目的和行为却是不同的。

时间: 2024-10-07 11:30:45

Objective-C中Extension与Category的使用的相关文章

OC中protocol、category和继承的区别

利用继承,多态是一个很好的保持"对扩展开放.对更改封闭"(OCP)的办法,也是最常见的一种方法.Objective C还支持另外两种语法来支持OCP:Protocol和Category.Protocol只能定义一套接口,而不能提供实现,变相的也是一种Abstract class的实现方式(oc 语法上本身不支持抽象基类).Category可以为类提供额外的接口和实现.那么到底三者(继承, Protocol,Category)在使用上到底有什么本质的区别呢?在我看来,protocol的作

objective C中的字符串(三)

holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7343561 objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的操作字符串,下面举几个例子: 1.创建: 直接利用等号赋值 NSString *

objective C中继承、协议、分类和多态的实现

第一.objective C中继承的实现 在oc中只有实例变量会有权限控制,实例方法和类方法是没有权限控制的,这点与c++不同,OC默认的是protected,并且在声明权限控制时,没有分号 在OC中可以像C++一样用指针运算法来访问实例变量 Rectangle.h 文件代码: #import <Foundation/Foundation.h> @interface Rectangle : NSObject { int _width; int _height; } @property (non

ios中的各种category

ios中的各种category by 伍雪颖 github 很方便,不用每个都自己写

objective C中的字符串

holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7343561 objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的操作字符串,下面举几个例子: 1.创建: 直接利用等号赋值 NSString *

xcode6中如何创建category,extension,protocol

我想有很多朋友们也跟我有过这样的疑惑,那就是新的Xcode6如何新建一个category,extension,protocol文件,也有很多人尽管自己去尝试找过了,但是没有找到,而不是Xcode6没有这个功能,而是你不够仔细.今天小农在经过几番寻找,才找到这个创建的方法. 无论是Mac端还是iOS端口,均是选择source下的oc file,如下所示: 选中后点击下一步: 看到了吗,下拉菜单可以选择你想要创建的文件.接下来,还可以选择你的原始类: 到这里,相信大家都明白了.我也不再赘述.

研究Extension和Category的一个例子

Category: 1. 无法添加实例变量 2.将类的实现分散到多个不同文件或多个不同框架中. Extension: 1. 可以添加实例变量 注: 如果Category的头文件中也使用Extension(即将 @interface MyData (XX)改为@interface MyData() ),依然不能使用变量. 千万不要认为在任何地方使用Extension,编译器都会将变量放进来. 但是如果MyData.m中,包含以下MyData+XX.h,那就可以运行通过. 所以什么情况下内存会将变量

iOS中的分类(category)

main.m Student *stu = [Student studentWithName:@"xiaomin" gender:@"man" age:118]; [stu study]; [stu playGame]; NSString+SayHi.h @interface NSString (SayHi) //分类(类目,Category),为米有源代码的类,扩充方法,并且只能扩充方法 //一但添加过方法之后,这些方法就是该类自己的方法,由该类的对象或者该类调用

Objective C中定义可变参函数

Objective C中有很多不定参函数,例如NSLog(format, arg1, arg2),还有字符串或数组在构造时所用的[NSString stringWithFormat: format, arg1, arg2, arg3],它们的方法原型分别是: FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2); + (id)stringWithFormat:(NSString *)format,