私の問題は、あるクラスでは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