好。艰难地找到最好的起点,在这里。 Lion中的错误XCode(4.3.2)正在向我反击:
Redefinition of 'a' with a different type
作者说当我们宣布这一行时(靠近本页底部,主要是......)
OwnedAppliance *a = [[OwnedAppliance alloc] init];
......它应该运行良好。它没有。它解决了上面的错误。我理解,因为OwnedAppliance在其实现中没有init方法,所以编译器会将层次结构上升到OwnedAppliance的超类(即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()现在包含实际导致错误的代码。感谢雅克尽管遗漏了,但还是能够抓住它。
答案 0 :(得分:2)
编译器实际上告诉你变量本身a
已经被声明了两次;错误与分配无关。在其他地方,在范围内,您有另一个名为a
的变量,其类型与OwnedAppliance *
不同。更改一个(或两个)的名称,错误将消失。