Пример неполной реализации Справка! - PullRequest
0 голосов
/ 27 июля 2011

Я работаю над примером из книги, которую я получил, и она, похоже, не работает. Я получаю предупреждение «Неполная реализация».Когда я запускаю программу, я получаю сообщение об ошибке «EXC_BAD_ACCESS».Предупреждение находится в файле .m в строке return [NSString stringWithFormat:@"Name:... Кто-нибудь знает, что я делаю неправильно?

мой файл .m

#import "RadioStation.h"


@implementation RadioStation

+ (double)minAMFrequency {
    return 520.0;
}

+ (double)maxAMFrequency {
    return 1610.0;
}

+ (double)minFMFrequency {
    return 88.3;
}

+ (double)maxFMFrequency {
    return 107.9;
}

- (id)initWithName:(NSString *)newName atFrequency:(double)newFreq  atBand:(char)newBand {
    self = [super init];
    if (self != nil) {
        name = [newName retain];
        frequency = newFreq;
        band = newBand;
    }

    return self;
}

- (NSString *)description {
    return [NSString stringWithFormat:@"Name: %@, Frequency: %.1f Band: %@", name, frequency, band];
}

- (void)dealloc {
    [name release];
    [super dealloc];
}

@end

мой файл .h

*Файл 1008 *

radiosimulation.m:

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // insert code here...
    NSMutableDictionary* stations = [[NSMutableDictionary alloc] init];
    RadioStation* newStation;

    newStation = [[RadioStation alloc] initWithName:@"Star 94"
                                        atFrequency:94.1
                                             atBand:'F'];

    [stations setObject:newStation forKey:@"WSTR"];
    [newStation release];

    NSLog(@"%@", [stations objectForKey:@"WSTR"]);

    newStation = [[RadioStation alloc] initWithName:@"Rocky 99"
                                        atFrequency:94.1
                                             atBand:'F'];

    [stations setObject:newStation forKey:@"WKFR"];
    [newStation release];

    NSLog(@"%@", [stations objectForKey:@"WKFR"]);

    [stations release];
    [pool drain];
    return 0;

1 Ответ

5 голосов
/ 27 июля 2011

Вы объявляете следующие методы доступа / мутаторы свойств (getter / setters), но не внедряете их в свой файл .m.

-(NSString *)name;
-(void)setName:(NSString *)newName;
-(double)frequency;
-(void)setFrequency:(double)newFrequency;
-(char)band;
-(void)setBand:(char)newBand;

Вам необходимо реализовать все 6 этих методов в файле .m, если вы хотите удалить предупреждение о неполной реализации.

Вы фактически говорите в .h файле, что это то, что собирается делать ваш объект, а не в .m. Это не приведет к ошибке, так как обмен сообщениями с целью-c означает, что сообщение будет передано в NSObject для обработки, что также не будет иметь соответствующей реализации, а сообщения будут просто игнорироваться. Мне не нравится то, как это показано только в качестве предупреждения - но вы идете.

Тем не менее, я бы не стал создавать такие свойства (есть более точные способы сделать это в target-c с использованием @property), я бы удалил эти объявления методов в .h и заменил их на:

@property (nonatomic, retain) NSString *name;
@property (nonatomic, assign) double frequency;
@property (nonatomic, assign) char band;

Эти объявления свойств находятся в том же месте, что и объявления методов.

, а затем добавьте в файл .m следующее:

@synthesize name;
@synthesize frequency;
@synthesize band;

Это избавит вас от необходимости писать весь тот шаблонный код доступа / мутатора, который вы в настоящее время не видите. Опять же, они идут в той же области кода, что и реализации методов. Фактически компилятор собирается автоматически создавать методы name и setName.

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

Еще один момент Я не уверен, что написанный код даже должен использовать методы или свойства get / set. Вы можете попробовать удалить объявления методов из .h и посмотреть, работает ли он. Кажется, что все обращения к имени, частоте и диапазону - все изнутри объекта.

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