Как мне вызвать + методы класса в Objective C без ссылки на класс?

Я предлагаю сделать сайт.com перенаправленным на www.site.com для согласованности и для избежания таких проблем.

Также рассмотрите использование кросс-браузерного решения, например PersistJS , которые могут использовать каждое собственное хранилище для браузера.

10
задан grapefrukt 8 November 2010 в 20:34
поделиться

3 ответа

This

id <Counter> counter = [[Model availableCounters] objectAtIndex:0];
return ( [counter countFor: nil] );

Should be

Class <Counter> counter = [[Model availableCounters] objectAtIndex:0];
return ( [counter countFor: nil] );

In the first you have an instance that conforms to . In the second you have a class that conforms to . The compiler warning is correct because instances that conform to don't respond to countFor:, only classes do.

20
ответ дан 3 December 2019 в 16:30
поделиться

Оказывается, он действительно работает, а предупреждение неверно.

Таким образом, остается вопрос, разумно ли это делать (используйте методы класса, если они не нужны в любом состоянии)?

И как лучше всего обработать предупреждение (мне нравится запускать предупреждение без предупреждения)?

Моим единственным обходным решением было наличие второго протокола (по сути, такого же, как первый, но объявить его на стороне экземпляра) :

@protocol CounterInstance
-(NSInteger) countFor: (Model *)model;
@end

И там, где я обращаюсь к счетчикам, используйте его вместо этого (чтобы обмануть компилятор):

id<CounterInstance> counter = [[MyModel availableCounters] objectAtIndex: self.index];
return [counter countFor: self];

Это немного неудобно, но работает. Интересуют мнения других?

0
ответ дан 3 December 2019 в 16:30
поделиться

A class in Objective-C does work like an instance -- the main underlying difference is that retain counting does nothing on them. However, what you're storing in the -availableCounters array aren't instances (the id type) but classes, which have a type of Class. Therefore, with the -availableCounters definition you specified above, what you need is this:

Class counterClass = [[MyModel availableCounters] objectAtIndex: self.index];
return ( [counterClass countFor: self] );

However, it would probably be semantically better if you used instances rather than classes. In that case, you could do something like the following:

@protocol Counter
- (NSUInteger) countFor: (Model *) model;
@end

@interface CurrentListCounter : NSObject<Counter>
@end

@interface SomeOtherCounter : NSObject<Counter>
@end

Then your model class could implement the following:

static NSArray * globalCounterList = nil;

+ (void) initialize
{
    if ( self != [Model class] )
        return;

    globalCounterList = [[NSArray alloc] initWithObjects: [[[CurrentListCounter alloc] init] autorelease], [[[SomeOtherCounter alloc] init] autorelease], nil];
}

+ (NSArray *) availableCounters
{
    return ( globalCounterList );
}

Then your use of that would be exactly as you specified above:

id<Counter> counter = [[Model availableCounters] objectAtIndex: self.index];
return ( [counter countFor: self] );
5
ответ дан 3 December 2019 в 16:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: