Objective c 目标-C-在以下方面有困难;初始值设定项链“;
好的。在这里很难找到最好的起点。Lion中的错误XCode(4.3.2)返回给我的是:Objective c 目标-C-在以下方面有困难;初始值设定项链“;,objective-c,initialization,xcode4.2,initializer,Objective C,Initialization,Xcode4.2,Initializer,好的。在这里很难找到最好的起点。Lion中的错误XCode(4.3.2)返回给我的是: Redefinition of 'a' with a different type 作者说,当我们声明这一行时(在本页底部附近,在main中) …它应该运行良好。没有。它消除了上面的错误。我理解,因为OwnedApplication在其实现中没有init方法,编译器将沿着层次结构向上搜索OwnedApplication的超类,即Appliance,并在那里搜索init方法。它查找重写的init,该init仅
Redefinition of 'a' with a different type
作者说,当我们声明这一行时(在本页底部附近,在main中)
…它应该运行良好。没有。它消除了上面的错误。我理解,因为OwnedApplication在其实现中没有init方法,编译器将沿着层次结构向上搜索OwnedApplication的超类,即Appliance,并在那里搜索init方法。它查找重写的init,该init仅包含以下行
[self initWithProductName:@"Unknown"];
…然后运行它。明白
啊。对不起,伙计们。我只是想解释一下我认为可能发生的事情。花了十几行,我才刚刚触及表面。与其说我认为正在发生的事情让你厌烦,我只想问:
这个代码是怎么回事?由于缺少更好的术语,初始化“路径”在哪里结束?重新定义(错误)发生在哪里
/******************设备.h********************/
#进口
@接口设备:NSObject
{
NSString*productName;
内部电压;
}
@属性(副本)NSString*productName;
@特性电压;
-(id)init;
//指定初始值设定项
-(id)initWithProductName:(NSString*)pn;
...
@结束
/********************电器********************/
#导入“Appliance.h”
@实现设备
@电压;
-(id)init
{
返回[self-initWithProductName:@“未知”];
}
-(id)initWithProductName:(NSString*)pn
{
self=[super init];
如果(自我){
[self-setProductName:pn];
[自整定电压:120];
}
回归自我;
...
@结束
/********************拥有应用程序********************/
#导入“Appliance.h”
@接口拥有应用程序:设备
{
NSMutableSet*所有者名称;
}
//指定初始值设定项
-(id)initWithProductName:(NSString*)pn
firstowner名称:(NSString*)n;
...
@结束
/********************拥有应用程序********************/
#导入“ownedApplication.h”
@实施所有权申请
-(id)initWithProductName:(NSString*)pn
firstOwnerName:(NSString*)n
{
self=[super initWithProductName:pn];
如果(自我){
所有者名称=[[NSMutableSet alloc]init];
如果(n){
[所有者名称添加对象:n];
}
}
回归自我;
}
-(id)initWithProductName:(NSString*)pn
{
返回[self-initWithProductName:pn
firstOwnerName:nil];
}
...
@结束
/********************main.m********************/
#进口
#导入“Appliance.h”
#导入“ownedApplication.h”
int main(int argc,const char*argv[]
{
@自动释放池{
//先前省略的问题代码:
设备*a=[[Appliance alloc]init];
NSLog(@“a为%@”,a);
[a setProductName:@“洗衣机”];
[a设定电压:240];
NSLog(@“a为%@”,a);
//以下行是发生错误的位置:
OwnedApplication*a=[[OwnedApplication alloc]init];
...
}
返回0;
}
关于这个问题以及如何提问,我想了很多。我不认为这是一个非常愚蠢的问题。:)但是我的大脑在研究这些东西的9个小时后被炸了,所以如果这是一个非常明显的问题,我道歉。蒂亚
编辑:main()现在包含了实际导致错误的代码。感谢Jacques,尽管省略了它,但它仍然能够捕获它。编译器实际上告诉您变量本身,
a
,已经声明了两次;错误与赋值无关。在范围中的其他地方,您还有另一个变量eda
,其类型与OwnedApplication*
不同。更改其中一个(或两个)的名称错误就会消失。尝试更改变量的名称。错误是关于变量本身,而不是赋值。Gross.lol正如我所怀疑的,答案非常明显。今天我不再学习了。谢谢,JC.:)明白了。我编辑并包含了问题代码,最初省略了。谢谢回答,Jacques。
[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;
}