Задача-С Одиночная проблема. Объект распознается в одном классе, но не в другом

Моя проблема в том, что я могу получить доступ к методам и атрибутам из 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; 

Мне кажется, что, возможно, вы портируете какой-то класс, который раньше работал с подвесками и браслетами, и изменили его так, чтобы он работал с бейсбольными мячами, и что вы пытались создать его, когда он был только наполовину модифицирован для работы с бейсбольными мячами.

Я предлагаю завершить ваши модификации так, чтобы все типы и имена свойств были согласованы между вашим интерфейсом и вашей реализацией, а затем посмотреть, по-прежнему ли вы видите проблему с отсутствующим селектором.

Другие вопросы по тегам