2012-08-07 128 views
-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

,我不B_ViewController.m

实施-(void) categoryMethod但它工作正常,并没有警告。

[obj categoryMethod]如何连接?

如果这是完美的语法,我有扩展问题。

,如果我有一个名为A_ViewController +产品组别

另一类这里的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,对吧?

回答

0

我很努力地找出你想要做的事情,但是对于标准的类别行为。

如果您想从B_BiewControllerA_ViewController实例上调用categoryMethod,则需要导入包含类别方法@interface的头。

由于私人类别或类别扩展名是特殊类别,因此您无法在B_ViewController.m之内声明A_ViewController的私人类别()

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方法名。这在目标C中是不正确的和未定义的行为。

+0

我在2天之前就曾想过你,但昨天我看到了类似于我的问题的代码,所以我有一个问题。 – MoonSoo 2012-08-07 01:15:56

+0

我已经更新了我的答案,但我不完全理解这个问题,因为类别是非常简单的,类别选择器不应该是相同的。 – Jessedc 2012-08-07 01:24:18