1

私の問題は、あるクラスではsharedInstanceシングルトンからメソッドと属性にアクセスできますが、別のクラスではアクセスできないことです。

たとえば、以下のコードは機能し、Xコードによって認識されます。正常に動作します。return [[[SINGLETON sharedInstance] baseballArray] count];

に加えて:

theSelectedBaseball = [[[SINGLETON sharedInstance]baseballArray]objectAtIndex:indexPath.row];

SINGLETON *singleton = [SINGLETON sharedInstance];
[singleton setSelectedBaseball:theSelectedBaseball];

ただし、上記のコードを別のクラスで試してみると、次の警告メッセージが表示されます。-メソッド-setSelectedBaseball:見つかりません。

使用したいすべてのクラスにSINGLETONヘッダーをインポートしています。認識されているクラスと認識されていないクラスをよく見てみると、なぜ認識されていないのかわかりません。

これが私のシングルトンクラスです。

#import <Foundation/Foundation.h>
#import "Baseball.h"

@interface SINGLETON : NSObject {

NSArray *baseballArray;
Baseball *selectedBaseball;
}

@property (nonatomic, retain) NSArray *baseballArray;
@property (nonatomic, retain) Baseball *selectedBaseball;

+ (SINGLETON*) sharedInstance;
- (void)setSelectedBaseball:(Baseball *)theBaseball;
- (Baseball*)getSelectedBaseball;

@end

実装:

#import "SINGLETON.h"
#import "Baseball.h"

@implementation SINGLETON

@synthesize baseballArray, selectedBaseball;
static SINGLETON *instance = nil;

+ (SINGLETON*)sharedInstance
{
@synchronized(self) {   
    if (instance == nil) {

        instance = [[SINGLETON alloc] init];
    }
    return instance;
}
}

- (void)setSelectedBaseball:(Baseball *)theBaseball
{
    selectedBaseball = theBaseball;  
}

- (Baseball*)getSelectedBaseball{
    return selectedBaseball;
}

- (id)init 
{
self = [super init];
if (self) {
    // created 5 Baseball Objects   
    // baseball array holding those 5 baseball objects
    baseballArray = [[[NSArray alloc] initWithObjects:Baseball1, Baseball2, Baseball3, Baseball4, Baseball5, nil] retain];

    // dealloced 5 Baseball Objects
}
return self;
}

+ (id)allocWithZone:(NSZone *)zone
{   
@synchronized(self) {       
    if (instance == nil) {

        instance = [super allocWithZone:zone];          
        return instance;  // assignment and return on first allocation
    }
}   
return nil; //on subsequent allocation attempts return nil  
}

- (id)retain
{   
return self;    
}

- (unsigned)retainCount
{
return UINT_MAX;  //denotes an object that cannot be released
}

- (id)autorelease
{
return self;    
}
- (void) dealloc
{
    [baseballArray release];
    [super dealloc];
}
@end
4

1 に答える 1

6

野球はブレスレットではありません。プロパティを次のように宣言します。

@property (nonatomic, retain) NSArray *baseballArray;
@property (nonatomic, retain) Charm *selectedBaseball;

...そして合成します:

@synthesize braceletArray, selectedBracelet;

baseballArray... and selectedBaseballasをマークすることなく@dynamic(ゲッター/セッターを自分で指定する場合)、実際に「braceletArray」および「selectedBracelet」と呼ばれるプロパティを宣言することもありません。

また、 aCharmも a ではありませんBaseball。一貫性のないゲッター メソッドとセッター メソッドを定義します。

- (void)setSelectedBaseball:(Baseball *)theBaseball;
- (Charm*)getSelectedBaseball; 

おそらく、チャームやブレスレットで動作していたクラスを移植して、野球で動作するように変更し、野球で動作するように半分しか変更されていないときにビルドしようとしたように思えます。

インターフェイスと実装の間ですべての型とプロパティ名が一致するように変更を完了し、引き続きセレクターの問題が発生するかどうかを確認することをお勧めします。

于 2011-07-09T00:53:50.357 に答える