1

我的问题是我可以从一个类中的 sharedInstance Singleton 访问方法和属性,但不能在另一个类中访问。

例如,下面的代码可以工作并且被 X-code 识别。工作正常。返回 [[[SINGLETON sharedInstance]baseballArray]count];

此外:

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

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

但是,如果我在另一个类中尝试上面的代码,我会收到以下警告消息: - Method - setSelectedBaseball: not found。

我在我想使用的所有类中导入 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;

...没有标记baseballArrayselectedBaseballas @dynamic(如果您打算自己指定它们的 getter/setter),也没有实际声明任何名为“braceletArray”和“selectedBracelet”的属性。

此外, aCharm也不是 a Baseball。您定义了不一致的 getter 和 setter 方法:

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

在我看来,您可能正在移植一些过去使用护身符和手镯的类并对其进行修改以使其适用于棒球,并且您尝试构建它时只修改了一半以适用于棒球。

我建议完成您的修改,以便所有类型和属性名称在您的接口和您的实现之间保持一致,然后查看您是否仍然看到缺少选择器的问题。

于 2011-07-09T00:53:50.357 回答