objective-c - Objective-C 中的类别用法

标签 objective-c

我看到一些我继承的代码如下所示:

@interface SomeClass (private)

这是在 SomeClass.m 中,实现文件。有一个附带的头文件并不表明该类正在使用类别。在这种情况下,(private) 是否只是为 SomeClass 的类别指定了一个糟糕的名称?我假设在实现中指定此类类别是完全合法的?

最佳答案

不是“private”这个名字让它成为私有(private)的;这些方法是私有(private)的,因为它们属于在实现文件中声明的类别。

一个category有3种用法,分别为类添加方法(注意:只有methods,没有iVars)

扩展现有的 Cocoa 类

这使您可以将自己的方法添加到现有类中。 例如,如果你想扩展 NSString 来应用特殊的大写,你可以创建一个新的类,比如 NSString+Capitals。在 NSString+Capitals.h 中,您将拥有:

@interface NSString (Capitals)

-(NSString *)alternateCaps:(NSString *)aString;

@end

在 NSString+Capitals.m 中你会实现这个方法

@implementation NSString (Capitals)
-(NSString *)alternateCaps:(NSString *)aString
{
    // Implementation
}

类的私有(private)方法

这与上面相同,除了在实现文件 (.m) 中声明和定义了额外的方法通常是一种拥有私有(private)方法的方式 - 因为它们不在 .h 文件中(这是一个 #由其他类导入)它们根本不可见。在这种情况下,方法的实现是在它们自己的实现 block 中完成的。例如

// someClass.m
@interface someClass (extension)
-(void)extend;
@end

@implementation someClass
    // all the methods declared in the .h file and any superclass
    // overrides in this block
@end

@implementation someClass (extension)
-(void)extend {
    // implement private method here;
}

类扩展(10.5 Leopard 的新功能)

拥有私有(private)方法的更简单方法。在这种特殊情况下,类别名称为空,私有(private)方法与所有其他类方法在同一 block 中实现。

// someClass.m
@interface someClass ()
-(void)extend;
@end

@implementation someClass
    // all the methods declared in the .h file and any superclass
    // overrides in this block
    // Implement private methods in this block as well.
-(void)extend {
    // implement private method here;
}

@end

这是一个 link有关类别和扩展的 Apple 文档。

关于objective-c - Objective-C 中的类别用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/360968/

相关文章:

iphone - 内存问题还是其他什么问题?

objective-c - 在 iOS 中切换搜索栏

objective-c - 遵循 iOS 教程时找不到特定代码

iphone - 使用 App store 对可执行文件进行了无效授权签名

objective-c - 如何制作圆角 NSTableView 行?

iphone - 如何跨 View Controller 链接网点?

objective-c - 何时使用 UIKIT_EXTERN 与仅使用 extern

ios - 如何在 AVCaptureVideoPreviewLayer 上显示覆盖

ios - Xcode 6 中的配置文件问题(重复)

objective-c - 简单的? argv[] 转换为 char*