Задача-С Одиночная проблема. Объект распознается в одном классе, но не в другом
Моя проблема в том, что я могу получить доступ к методам и атрибутам из Singleton sharedInstance в одном классе, но не могу в другом.
Например, приведенный ниже код работает и распознается 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
1 ответ
Бейсбол не браслет. Вы заявляете свои свойства как:
@property (nonatomic, retain) NSArray *baseballArray;
@property (nonatomic, retain) Charm *selectedBaseball;
... а затем вы синтезируете:
@synthesize braceletArray, selectedBracelet;
... без разметки baseballArray
а также selectedBaseball
как @dynamic
(если вы намереваетесь указать их методы получения / установки самостоятельно) и без объявления каких-либо свойств, называемых "braceletArray" и "selectedBracelet".
Также Charm
тоже не Baseball
, Вы определяете несовместимые методы получения и установки:
- (void)setSelectedBaseball:(Baseball *)theBaseball;
- (Charm*)getSelectedBaseball;
Мне кажется, что, возможно, вы портируете какой-то класс, который раньше работал с подвесками и браслетами, и изменили его так, чтобы он работал с бейсбольными мячами, и что вы пытались создать его, когда он был только наполовину модифицирован для работы с бейсбольными мячами.
Я предлагаю завершить ваши модификации так, чтобы все типы и имена свойств были согласованы между вашим интерфейсом и вашей реализацией, а затем посмотреть, по-прежнему ли вы видите проблему с отсутствующим селектором.