Objective-C - 在执行 "Initializer Chain"后遇到问题

标签 objective-c initialization xcode4.2 initializer

好的。在这里很难找到最好的起点。 Lion 中的 XCode (4.3.2) 错误给我带来的是:

Redefinition of 'a' with a different type

作者说,当我们声明这一行时(靠近本页底部,在主窗口中)...

OwnedAppliance *a = [[OwnedAppliance alloc] init];

...它应该运行良好。事实并非如此。它会退回上面的错误。据我了解,因为 OwnedAppliance 在其实现中没有 init 方法,所以编译器将沿着层次结构向上到达 OwnedAppliance 的父类(super class)(即 Appliance),并在那里搜索 init 方法。它找到了被覆盖的 init,其中仅包含以下行...

[self initWithProductName:@"Unknown"];

...并运行它。明白了。

呃。对不起大家。我只是试图解释我认为可能发生的事情。我花了十几行,但只触及了表面。我不想让您厌倦我认为正在发生的事情,我只想问:

这段代码是怎么回事?由于缺乏更好的术语,初始化“路径”在哪里结束?重新定义(错误)发生在哪里?

/********************  Appliance.h  ********************/

#import <Foundation/Foundation.h>

@interface Appliance : NSObject
{
    NSString *productName;
    int voltage;
}

@property (copy) NSString *productName;
@property int voltage;

-(id)init;
// Designated initializer
-(id)initWithProductName:(NSString *)pn;
...
@end

/********************  Appliance.m  ********************/

#import "Appliance.h"

@implementation Appliance

@synthesize productName, voltage;

-(id)init
{
    return [self initWithProductName:@"Unknown"];
}

-(id)initWithProductName:(NSString *)pn
{
    self = [super init];

    if (self) {    
    [self setProductName: pn];
    [self setVoltage: 120];
    }

    return self;
...

@end

/********************  OwnedAppliance.h  ********************/

#import "Appliance.h"

@interface OwnedAppliance : Appliance
{
    NSMutableSet *ownerNames;
}

// Designated initializer
-(id)initWithProductName:(NSString *)pn
          firstOwnerName:(NSString *)n;
...

@end

/********************  OwnedAppliance.m  ********************/

#import "OwnedAppliance.h"

@implementation OwnedAppliance

-(id)initWithProductName:(NSString *)pn
          firstOwnerName:(NSString *)n
{
    self = [super initWithProductName:pn];

    if (self) {
        ownerNames = [[NSMutableSet alloc] init];

    if (n) {
        [ownerNames addObject:n];
        }
    }
    return self;
}

-(id)initWithProductName:(NSString *)pn
{
    return [self initWithProductName:pn
                      firstOwnerName:nil];
}
...
@end

/********************  main.m  ********************/

#import <Foundation/Foundation.h>
#import "Appliance.h"
#import "OwnedAppliance.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
    //  Previously omitted problematic code:
        Appliance *a = [[Appliance alloc] init];
        NSLog(@"a is %@", a);
        [a setProductName:@"Washing Machine"];
        [a setVoltage:240];
        NSLog(@"a is %@", a);

    //  The following line is where the error occurs:
        OwnedAppliance *a = [[OwnedAppliance alloc] init];
        ...
    }
    return 0;
}

我对这个问题以及如何提出这个问题思考了很多。我不认为这是一个非常愚蠢的事情。 :) 但是我的大脑因为 9 个小时的研究而疲惫不堪,所以如果这是一个完全显而易见的问题,我深表歉意。 TIA

编辑:main() 现在包含实际导致错误的代码。感谢 Jacques 足够出色地捕获了它,尽管有遗漏。

最佳答案

编译器实际上告诉您变量本身 a 已声明两次;该错误与作业无关。在范围内的其他地方,您有另一个名为 a 的变量,它的类型与 OwnedAppliance * 不同。更改其中一个(或两个)的名称,错误就会消失。

关于Objective-C - 在执行 "Initializer Chain"后遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10406523/

相关文章:

initialization - 如何在 VHDL 中初始化位向量

iphone -- 在第二代 iPod Touch 上运行 XCode 4.2 和 iOS 5 SDK

iphone - 在 iOS 中写入 .kml 文件

iphone - 如何正确管理我的应用程序网址?

c - 当我做这个作业时到底发生了什么

ios - 在 ios 中上传或下载图像的最佳方式。 FTP 与 HTTP

c++ - 使用 lambda 的简单 RAII 包装器的复制初始化在 GCC 和 Clang 下意外失败

ios - 如何更改组 UITableView 中第一行和最后一行的颜色?

iphone游戏控制帮助

ios - 搜索栏工作正常,但当我想设置表格单元格标签时崩溃