iPhone Obj-C用于声明私有方法匿名类别或“私人”类别哪个更好?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

为了声明私有方法,哪个更好?

@interface MyClass()

@interface MyClass(private)
提问于
用户回答回答于

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

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

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

(2)宣布一组可能或可能不会由代表实施的方法。示例:各种类声明 - 但不实现 - @interface NSObject(SetODelegateMethods)。

Form(2)现在已经失宠,因为@protocol已经扩展到支持Objective-C 2.0中的@optional方法。

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

在@综合访问器之前,类扩展也可用于重新声明公开只读@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)使用匿名类别需要在相应类的主@implementation块中实现其方法; 匿名类别允许为位于主类@interface块之外的位置中的类声明额外的必需API

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

扫码关注云+社区

领取腾讯云代金券