-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) categoryMethodB_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_ViewControllerB_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 に答える