我看到一些我继承的代码如下所示:
@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/