2011-07-09 5 views
1

私の問題は、あるクラスのsharedInstanceシングルトンからメソッドと属性にアクセスできますが、別のクラスでは使用できないということです。Objective-Cシングルトン問題。あるクラスでは認識されているオブジェクトが他のクラスで認識されていません

たとえば、以下のコードは動作し、Xコードで認識されます。正常に動作します。 戻り値[[[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 

答えて

6

野球はブレスレットではありません。あなたは、としてあなたの特性を宣言します。

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

...そして、あなたは合成:

@synthesize braceletArray, selectedBracelet; 

を...今まで@dynamicとしてbaseballArrayselectedBaseball(あなたは自分のゲッターを指定する場合は/自分でセッターをマークせず)、そして実際には "braceletArray"と "selectedBracelet"というプロパティを宣言することなく。

また、CharmBaseballではありません。あなたは、一貫性のないgetterメソッドとsetterメソッドを定義します。

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

あなたが構築しようとしたことを、おそらくあなたが魅力とブレスレットで動作するように使用されるいくつかのクラスを移植し、それが野球で動作するようにそれを変更しているように私には思われる、とそれが野球で働くために途中で修正されたときに。

すべてのタイプとプロパティ名がインターフェイスと実装の間で一貫していることを確認して、セレクタの問題がまだ解消されていないかどうかを確認することをお勧めします。

+0

良い分析+1 – Sid

+0

getterとsetterを標準的な規約に従って使用する場合は、@dynamicを指定する必要はありません(これは設定者用です)。 – Chuck

+0

@Chuck - 必須ではありませんが、とにかくそれを使うには良いスタイルであると言えます。また、 '@ synthesize'や' @dynamic'と一致しないプロパティがあると、XCodeはコンパイラの警告を報告しませんか? – aroth

関連する問題