2012-08-07 125 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