2

おそらくこれは間違った方法ですが、どうすればコンパイラの警告を消すことができるのだろうか?

@interface SomeView : UIView {
 NSString *stringOfsomeImportance;
 RelatedClass *niftyService;
}
@property (nonatomic, copy) NSString * stringOfnoImportance;
@property (nonatomic, retain) RelatedClass *niftyService;

@implementation
-(void)someMethod;
-(void)otherMethods;

@implementation    RelatedClass *pvSomeObj = [[RelatedClass alloc] initWithSender:self];
[self setNiftyService:pvSomeObj];

さて、RelatedClass の実装を見てみましょう...

@interface RelatedClass : NSObject {
  id  thesender;

@property (nonatomic, retain) id thesender;


@implementation

[thesender otherMethods];  // this generates a compiler warning
                           // that otherMethods cannot be found
                           // in SomeView, though it *is* found
                           // and seems to execute just fine

これは有効なアプローチのように思えるので、なぜ警告が表示されるのか疑問に思っています。これをコンパイラに「説明」する方法はありますか?

このタイプのリンケージが奨励されているか、または相互に通信する必要がある 2 つの関連する相互依存クラスをリンクするより良い方法があるかどうか、誰かが親切に共有できますか?

SomeView は RelatedClass をメンバーとして定義されているため、RelatedClass で送信者オブジェクト (SomeView) を静的に宣言することはできません。再帰の問題が発生するようです...

助言がありますか?

4

3 に答える 3

1

ヘッダーでは、使用するクラスを前方宣言できます。実装ファイルには、前方宣言したクラスの完全なヘッダーを含めることができます。

例えば:


SomeView.h

#import <FrameworkHeader.h>

// Here, you are saying that there is a class called RelatedClass, but it will be
// defined later.
@class RelatedClass;

@interface SomeView : UIView
{
    RelatedClass *niftyService;
}

@end

SomeView.m

#import "SomeView.h"
#import "RelatedClass.h"

// By including "RelatedClass.h" you have fulfilled the forward declaration.

@implementation SomeView
// Can use "RelatedClass" methods from within here without warnings.
@end

RelatedClass.h

#import <FrameworkHeader.h>

@class SomeView;

@interface RelatedClass
{
    SomeView *someView;
}
// methods
@end

RelatedClass.m

#import "RelatedClass.h"
#import "SomeView.h"

@implementation RelatedClass
// Can use "SomeView" methods from within here without warnings.
@end
于 2010-02-16T08:14:24.887 に答える
1
  1. プロトコルを定義して、thesenderオブジェクトがそれに準拠する必要があると言うことができます。

    @protocol MyProtocol
       -(void)otherMethods;
    @end
    
    @interface RelatedClass : NSObject {
       id<MyProtocol>  thesender; // Now compiler knows that thesender must respond 
                                  // to otherMethods and won't generate warnings
    }
    
  2. 別の方法でメッセージを送信できます(ここで NSObject としてotherMethods定義する必要がある場合があります)。theSender

    if ([theSender respondsToSelector:@selector(otherMethods)])
        [theSender performSelector:@selector(otherMethods)];
    
  3. 編集:実際には、前方クラス宣言を使用して、RelatedClass で送信者を SomeView* として定義することもできます。

    //SomeView.h
    @class RelatedClass;
    @interface SomeView : UIView {
       RelatedClass *niftyService;
    }
    // then include RelatedClass.h in SomeView.m
    
    //RelatedView.h
    @class SomeView;
    @interface RelatedClass : NSObject {
       SomeView*  thesender;
    }
    // then include SomeView.h in RelatedClass.m
    
于 2010-02-16T07:21:14.980 に答える
0
id  thesender = ....;
[thesender otherMethods];  // this generates a compiler warning
                           // that otherMethods cannot be found
                           // in SomeView, though it *is* found
                           // and seems to execute just fine

上記で説明したように警告が生成されるのは-otherMethods、呼び出しサイトをコンパイルしようとする前に、コンパイラが宣言を確認する場所でメソッドが宣言されていないためです。

つまり、メソッドの宣言:

- (void) otherMethods;

特定の呼び出しサイトをコンパイルする実装ファイルによって (直接的または間接的に) インポートされるヘッダー ファイルに表示される、メソッド宣言が呼び出しサイトの@implementation 前に表示される必要があります。

于 2010-02-16T08:05:51.933 に答える