不完整的实施示例帮助!

时间:2011-07-27 15:42:16

标签: objective-c xcode

我正在研究一本书中的例子我得到了它似乎没有工作我收到警告不完整的实施。当我运行程序时,我得到一个错误信号“EXC_BAD_ACCESS”。警告位于return [NSString stringWithFormat:@"Name:...行的.m文件中。是否有人知道我做错了什么?

我的.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文件

#import <Cocoa/Cocoa.h>


@interface RadioStation : NSObject {
    NSString *name;
    double    frequency;
    char      band;
}

+ (double)minAMFrequency;
+ (double)maxAMFrequency;
+ (double)minFMFrequency;
+ (double)maxFMFrequency;

-(id)initWithName:(NSString*)name
       atFrequency:(double)freq
            atBand:(char)ban;
-(NSString *)name;
-(void)setName:(NSString *)newName;
-(double)frequency;
-(void)setFrequency:(double)newFrequency;
-(char)band;
-(void)setBand:(char)newBand;

@end

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 个答案:

答案 0 :(得分:5)

您正在声明以下属性访问者/ mutators(getter / setters),但未在.m文件中实现它们。

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

如果要删除有关不完整实现的警告,则需要在.m文件中实现所有这6个方法。

你实际上在.h文件中说这是你的对象要做的事情,然后不在.m中做。它不会产生错误,因为objective-c消息传递意味着消息将被传递给NSObject进行处理,这也将没有任何匹配的实现,并且消息将被静默忽略。我不喜欢这只作为警告显示的方式 - 但是你去了。

那就是说,我不会创建这样的属性(在使用@property的Objective-c中有更简洁的方法),我会删除.h中的那些方法声明并将它们替换为:

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

这些属性声明与方法声明的位置相同。

然后将以下内容添加到.m文件中:

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

这将避免必须编写您当前缺少的所有样板访问器/ mutator代码。同样,这些与代码实现的代码区域相同。有效地,编译器将自动创建name和setName方法。

此代码未经测试 - 但应指出正确的方向来整理不完整的实现。 可以修复您的访问错误 - 但这可能需要更详细地查看堆栈跟踪。

另一点我不确定编写的代码是否需要使用get / set方法或属性。您可以尝试从.h中删除方法声明,看看它是否有效。似乎所有对名称,频率和波段的访问都来自对象内部。