1

別のクラス内からカスタム クラスを初期化しました。その後、カスタム クラスから関数を実行し、それが完了したら、それを初期化したクラスからメソッドを呼び出します。

// classA.m

-(void)methodA {
    // do some complicated stuff
    if (result) {
        [classB methodB];
    }
}

// classB.m    

-(void)methodA {
    classAInstance = [[classA alloc] init];
    [classAInstance methodA];
}

-(void)methodB {
    // got result, do more stuff
}

[classB methodB]うまくいきませんが、これがどのように達成されるのか見当がつかないので、どんな助けでも大歓迎です、ありがとう。

4

4 に答える 4

2

私はobjective-cが初めてなので、ご容赦ください。

よろしければ、この服を着たままにします。

必要なものを実現する 1 つの方法は、「構成」を使用することです。これは、B のインスタンスであるメンバー変数を持つように A を記述することを意味します。その後、A は B のそのインスタンスを使用して B のメソッドを呼び出すことができます。

あ:

#import <Cocoa/Cocoa.h>
#import "B.h"

@interface A : NSObject {
    B* my_b;
}
- (id)init:(B*)b;
- (void)methodA;

@end

.

午前:

#import "A.h"

@implementation A

- (id)init:(B*)b
{
    if (![super init])
    {
        return nil;
    }

    my_b = b;

    return self;
}

- (void)methodA 
{
    [my_b methodB];
}

@end

.
Bh:

#import <Cocoa/Cocoa.h>

@interface B : NSObject {

}
- (void)do_stuff;
- (void)methodB;

@end

.
Bm:

#import "B.h"
#import "A.h"

@implementation B

- (void)do_stuff
{
    A* a = [[A alloc] init:self];
    [a methodA];
}

- (void)methodB
{
    NSLog(@"hello");
}

@end

===

あなたが書いたので:

[classB methodB];

...B でクラス メソッドを呼び出したいと思うかもしれません。

あ:

#import <Cocoa/Cocoa.h>
#import "B.h"

@interface A : NSObject {

}
- (void)methodA;

@end

午前:

#import "A.h"
#import "B.h"

@implementation A

- (void)methodA 
{
    [B classMethodB];
}

@end

Bh:

#import <Cocoa/Cocoa.h>

@interface B : NSObject {

}
+ (void)classMethodB;
- (void)do_stuff;

@end

Bm:

#import "B.h"
#import "A.h"

@implementation B

- (void)do_stuff
{
    A* a = [[A alloc] init];
    [a methodA];
}


+ (void)classMethodB   //Note the '+'
{
    NSLog(@"hello");
}

@end
于 2013-07-06T01:07:16.877 に答える
1

ここで他の投稿者が見落としている非常に重要なものがあると思います: 保持サイクルです。親オブジェクトを参照しようとする子メソッドは、弱い参照または __unsafe_unretained 修飾子を使用して行う必要があります。そうしないと、親オブジェクトが保持サイクルに巻き込まれる危険があります。質問が理解できれば、クラス「B」オブジェクトで特定のメソッドが終了したときに、クラス「A」オブジェクトのメソッドを呼び出したいだけですか? 私は通常、デリゲートとプロトコル (より難しい概念) または NSNotificationCenter (それほど難しい概念) の 2 つの方法のいずれかを行います。あなたの場合、別のクラスの別のメソッドが完了したときに 1 つのメソッドに「通知」しようとしているだけなので、通知センターの方がはるかに使いやすいようです。ここにかなり良いチュートリアルがあります:http://blog.isotoma.com/2009/11/on-objective-c-delegates-and-nsnotification-objects/しかし、基本的な前提は次のとおりです。

メソッドの最後に (クラス B で) 作業を行うメソッドでは、次のようなものを挿入します。

NSNotification* notification = [NSNotification notificationWithName:@"MyNotification" object:self];  
[[NSNotificationCenter defaultCenter] postNotification:notification];

次に、クラス A の init メソッドで、その通知を受け取るように登録します。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MethodToCallAfterNotification:) name:@"MyNotification" object:nil];

クラス B メソッドが終了するたびに、「MyNotification」通知がブロードキャストされます。クラス A オブジェクトはこれらの通知をリッスンしているため、その通知がアプリでブロードキャストされるたびに、指定したセレクターが自動的に呼び出されます。

クラス A の実装ファイルに dealloc メソッドを作成し、次のようにオブザーバーを登録解除してください。

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"MyNotification" object:nil];

弱い参照デリゲート メソッド呼び出しでこれを行う方法を学習することに興味がある場合は、それに関する回答をここに投稿しました: https://stackoverflow.com/a/10273551/1318525

于 2013-07-06T03:14:23.597 に答える
0
#classA.m

-(void)methodA:(classB *)classB {

#classB.m    

[classAInstance methodA:self];
于 2013-07-06T00:42:39.143 に答える
0

メソッドを呼び出す前に、クラスのオブジェクトを初期化して明示的なメソッドを呼び出す必要があります...のように

// classA.m
- (void)somethingA{ }

メソッドがクラスの暗黙的なメソッドである場合、コードは機能します。クラスオブジェクトを作成または初期化する必要はありませんが、暗黙的なメソッドはクラスによってのみ呼び出すことができることに注意してください..のように

// classB.m
+ (void)somthingB {}
于 2013-07-06T00:59:33.593 に答える