2012-02-11 2 views
1

Класс A имеет UIImage.Неправильное использование статических переменных?

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

До класса В инстанциируются, я хочу вызвать статический метод класса B, чтобы назначить экземпляр класса А.

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

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

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

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

Non-статический метод в классе А:

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

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

UIImage *img = [classA_ imageWithIdentifier:ImageIdentifier_Foo]; 

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

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

Я добавления объявления перечислимую здесь: *

typedef enum 
{ 
    ImageIdentifier_Foo = 0, 
    ImageIdentifier_Bar 
} ImageIdentifier; 

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

+0

Почему _class_ 'B' должен иметь ссылку на _instance_' A' перед созданием _instance_ 'B'? Каждый экземпляр «B» будет иметь экземпляр _same_ 'A'. –

+0

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

ответ

2

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

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

+ (void) initialize 

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

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

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

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

Что касается вашего неявного преобразования ... что переменная «а», выше этого вы написали classA_. Вы можете показать свою декларацию перечисления. Вы импортировали 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.ч

@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

Класс A имеет собственный метод init, который вызывает [super init], как и любой другой класс. Я не сохраняю, потому что я использую ARC. Я допустил ошибку в своем коде, я изменил имя переменной для «a». Да, класс с именами типов импортируется. Как ни странно, в классе A теперь я вижу ошибки в сигнатурах метода интерфейса «Ожидание типа», но заголовок для типа импортируется, а имя типа - синим, что четко показывает, что компилятор распознает имя типа. Добавьте вышеперечисленную декларацию. Что я делаю, должно быть правильно? Может быть, XCode странно? – TigerCoding

+0

Благодарим вас за помощь. Это сводило меня с ума. – TigerCoding

+0

Отмечено правильно, поскольку вы ясно показали, что это можно сделать. – TigerCoding

0

Ошибка вышла прояснилось.

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

Возможно, это вызвало круговую ссылку?

+0

Не думайте так. Я просто попробовал это с моим примером кода и все еще никаких проблем. – bandejapaisa

+0

Я думаю, что Xcode только что был прикручен (не будет в первый раз). Спасибо за вашу помощь. – TigerCoding

Смежные вопросы