在objective-c概念中的混淆类别

时间:2012-08-07 01:01:05

标签: iphone objective-c ios categories

我想知道objective-c

中的类别

我有3个文件

  1. A_ViewController

  2. A_ViewController +分类

  3. B_ViewController

  4. 这是示例代码

    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 + 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,对吗?

1 个答案:

答案 0 :(得分:0)

我正在努力解决你想要做的事情,但是关于标准类别的行为。

如果要在categoryMethod内的A_ViewController实例上调用B_BiewController,则需要导入包含类别方法@interface的标题。

您无法在()内的A_ViewController上声明私人类别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中不正确和未定义的行为。