样式(和功能上,如果有任何区别),用于声明私有方法,哪些更好?
@interface MyClass()
@interface MyClass(private)
答案 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程序员来说尤为重要。他们的代码将被注入他们无法控制的应用程序或框架代码中。