好的。在这里很难找到最好的起点。 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/