匿名类别或“私人”类别是否相同?

时间:2009-06-27 06:30:27

标签: objective-c cocoa cocoa-touch

样式(和功能上,如果有任何区别),用于声明私有方法,哪些更好?

@interface MyClass()

@interface MyClass(private)

2 个答案:

答案 0 :(得分:41)

这两种语法有不同的用途。

命名类别 - @interface Foo(FooCategory) - 通常用于:

(1)通过添加功能扩展现有类。示例:Foundation中的NSAttributedString由AppKit中的类别扩展,该类别添加了AppKit特定的类似RTF的文本格式API。

(2)声明委托可能会或可能不会实现的一组方法。示例:各种类声明 - 但不实现 - @interface NSObject(SetODelegateMethods)。

由于@protocol已扩展为支持Objective-C 2.0中的@optional方法,因此表格(2)已失宠。

类扩展 - @interface Foo() - 旨在允许您声明用于实现类内部的其他私有API - SPI或系统编程接口。这通常出现在.m文件的顶部。在类扩展中声明的任何方法/属性必须在@implementation中实现,就像在public @interface中找到的方法/属性一样。

类扩展也可用于在@ synthesize访问器之前将公开读取的@property重新声明为readwrite。

示例:

foo.h中

@interface Foo:NSObject
@property(readonly, copy) NSString *bar;
-(void) publicSaucing;
@end

Foo.m

@interface Foo()
@property(readwrite, copy) NSString *bar;
- (void) superSecretInternalSaucing;
@end

@implementation Foo
@synthesize bar;
.... must implement the two methods or compiler will warn ....
@end

答案 1 :(得分:2)

是,

存在以下差异。

1)使用匿名类别需要在主要的@implementation块中为相应的类实现其方法;匿名类别允许您在主类@interface块以外的位置为类声明其他必需的API

2)使用MyClass(私有)时,必须考虑以下内容:对象/类别命名对必须是唯一的。如果您在自己的类中声明私有类别,则没有问题。但是,现有类的情况有所不同。例如,给定的Objective-C命名空间中只能存在一个NSString(Private)类别。这可能会导致问题,因为Objective-C命名空间在程序代码和所有库,框架和插件之间共享。这对于编写屏幕保护程序,首选项窗格和其他插件的Objective-C程序员来说尤为重要。他们的代码将被注入他们无法控制的应用程序或框架代码中。