Неправильное использование статических переменных? - PullRequest
1 голос
/ 11 февраля 2012

Класс A имеет UIImage.

Класс B имеет статическую ссылку на класс типа A.

Прежде чем создать экземпляр класса B, я хочу вызвать статический метод в классе B, чтобы назначить экземпляр класса A.

+ (void)setClassAReference:(ClassA*)classA
{
    classA_ = classA;
}

Возможно ли это?

Прежде чем углубиться в свой текущий проект, я создал примерный и смог установить целочисленное значение, а затем создать экземпляр B, сохранив сохраненное значение и предоставив доступ к нему.

Однако в моем текущем проекте XCode отказывается разрешить мне передавать целочисленное значение:

Нестатический метод в классе A:

- (UIImage*)imageWithIdentifier:(ImageIdentifier)identifier; // identifier is enum type

После создания экземпляра класса B я пытаюсь вызвать метод в A:

UIImage *img = [classA_ imageWithIdentifier:ImageIdentifier_Foo];

Но я получаю неявное предупреждение о преобразовании. Автозаполнение показывает (id) вместо (ImageIdentifier). Я трижды проверил все мои сигнатуры методов, и все они используют тип enum.

Я использую статические переменные неправильно или есть другая проблема? Я понимаю, что мог бы использовать синглтон, но я бы предпочел этого не делать, если возможно.

Я добавляю объявление enum здесь: *

typedef enum
{
  ImageIdentifier_Foo = 0,
  ImageIdentifier_Bar
} ImageIdentifier;

* настоящие имена изменены, чтобы защитить невинных.

Ответы [ 2 ]

2 голосов
/ 12 февраля 2012

Во-первых ...

Если вы хотите инициализировать статические переменные в классе до его создания, вы используете метод класса в NSObject

+ (void) initialize

Здесь вы можете назначить статическую переменную ClassA в ClassB.

Во-вторых ....

Убедитесь, что вы сохранили эту переменную classA, иначе она будет освобождена.

В-третьих .....

Что касается вашего неявного преобразования ... что такое переменная 'a', выше этого вы написали classA_. Можете ли вы показать свою декларацию enum. Вы импортировали ClassA?

У меня нет ошибки компиляции с этим:

ClassA.h

typedef enum
{
    ImageIdentifier_Foo = 0,
    ImageIdentifier_Bar
} ImageIdentifier;

@interface ClassA : NSObject

- (UIImage*)imageWithIdentifier:(ImageIdentifier)identifier; // identifier is enum type

@end

ClassA.m

#import "ClassA.h"

@implementation ClassA

- (UIImage*)imageWithIdentifier:(ImageIdentifier)identifier {
    return nil;
}

@end

ClassB.h

@interface ClassB : NSObject

@end

ClassB.m

#import "ClassB.h"
#import "ClassA.h"

static ClassA *classA;

@implementation ClassB

+ (void) initialize {
    classA = [[ClassA alloc] init];
}

- (void) doSomething {
    UIImage *image = [classA imageWithIdentifier:ImageIdentifier_Foo];
    NSLog(@"image %@", image);
}

@end
0 голосов
/ 12 февраля 2012

Устранена ошибка.

Я импортировал класс A в файл .h класса B. Он также импортировался в файл .m класса B. Я удалил импорт в.h файл и изменил его на @class ClassA, и все автоматически разрешилось само по себе.

Может быть это вызвано циклической ссылкой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...