-1

嗨,我想知道 Objective-C 中的类别

我有 3 个文件

  1. A_ViewController

  2. A_ViewController+类别

  3. B_ViewController

这是示例代码

1-1。A_ViewController.h

@interface A_ViewController {
// some instance Variables
}
//some public methods
@end

1-2 A_ViewController.m

#import "A_ViewController.h."
@implementation A_ViewController
// implementation public methods and private methods
@end

2-1。A_ViewController+Category.h

@interface A_ViewControler(Category)
-(void) categoryMethod;
@end

2-2。A_ViewController+Category.m

#import "A_ViewController.h"
#import "A_ViewController+Category.h"
@implementation A_ViewController(Category)
-(void) categoryMethod {
     NSLog(@"it's A_ViewController+Category");
}
@end

3-1。B_ViewController.h

@interface B_ViewController {
// some instance variables
}
-(void) myMethod;

3-2。B_ViewController.m

#import "B_ViewController.h"
#import "A_ViewController.h"
@interface A_ViewController() // i think it's A_ViewController extension, not A_ViewController+Category, am i right?
-(void) categoryMethod;
@end
@implementation B_ViewController
-(void) myMethod
{
     A_ViewController *obj = [[A_ViewController alloc] init];
     [obj categoryMethod];
}
@end

我以为它崩溃了,因为我没有导入 A_ViewController+Category.h

而且我没有-(void) categoryMethod在 B_ViewController.m 中实现

但它工作正常,没有警告。

怎么[obj categoryMethod]能联系起来??

如果这是非常好的语法,我有扩展问题。

如果我有另一个名为 A_ViewController+Category2 的类别

这是 A_ViewController+Category.h

@interface A_ViewController(Category2)
-(void) categoryMethod;
@end

和 A_ViewController+Category2.m

#import "A_ViewController.h"
#import "A_ViewController+Category2.h"
@implementation A_ViewController(Category2)
-(void) categoryMethod
{
    NSLog(@"it's A_ViewController+Category2");
}
@end

而这种情况,如果我写一个像 3-2 这样的代码,

那么[obj categoryMethod]可以保证

来自 A_ViewController+Category 或 A_ViewController+Category2,对吗?

4

1 回答 1

0

我正在努力弄清楚你想要做什么,但关于标准类别行为。

如果要调用fromcategoryMethod的实例,则需要导入包含类别方法 @interface 的标头。A_ViewControllerB_BiewController

您不能()A_ViewControllerfrom within上声明私有类别B_ViewController.m,因为私有类别或类扩展是一个特殊类别。

B_ViewController.m 应该是这样的

#import "B_ViewController.h"
#import "A_ViewController+Category.h"

@implementation B_ViewController

- (void) myMethod {
  A_ViewController *obj = [[A_ViewController alloc] init];
  [obj categoryMethod];
}

@end

编辑

我刚刚注意到您的Category2方法名称与您的Category方法名称相同。这是 Objective C 中不正确和未定义的行为。

于 2012-08-07T01:06:21.733 回答