当我有两个使用同名但类型不同的参数的初始化程序的类时,我在 Objective-C 中遇到了一个奇怪的问题。例如,假设我创建了 A 类和 B 类:
啊:
#import <Cocoa/Cocoa.h>
@interface A : NSObject {
}
- (id)initWithNum:(float)theNum;
@end
是:
#import "A.h"
@implementation A
- (id)initWithNum:(float)theNum
{
self = [super init];
if (self != nil) {
NSLog(@"A: %f", theNum);
}
return self;
}
@end
乙:
#import <Cocoa/Cocoa.h>
@interface B : NSObject {
}
- (id)initWithNum:(int)theNum;
@end
体重:
#import "B.h"
@implementation B
- (id)initWithNum:(int)theNum
{
self = [super init];
if (self != nil) {
NSLog(@"B: %d", theNum);
}
return self;
}
@end
主.m:
#import <Foundation/Foundation.h>
#import "A.h"
#import "B.h"
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
A *a = [[A alloc] initWithNum:20.0f];
B *b = [[B alloc] initWithNum:10];
[a release];
[b release];
[pool drain];
return 0;
}
当我运行它时,我得到以下输出:
2010-04-26 20:44:06.820 FnTest[14617:a0f] A: 20.000000
2010-04-26 20:44:06.823 FnTest[14617:a0f] B: 1
如果我颠倒导入的顺序,使其首先导入 Bh,我得到:
2010-04-26 20:45:03.034 FnTest[14635:a0f] A: 0.000000
2010-04-26 20:45:03.038 FnTest[14635:a0f] B: 10
出于某种原因,它似乎使用了在两个类中首先包含的 @interface 中定义的数据类型。我通过调试器进行了一些单步调试,发现 a 和 b 对象的 isa 指针最终相同。我还发现,如果我不再使 alloc 和 init 调用内联,那么两个初始化似乎都可以正常工作,例如:
A *a = [A alloc];
[a initWithNum:20.0f];
如果我在创建 a 和 b 时使用此约定,我会得到正确的输出,并且每个对象的 isa 指针似乎都不同。
难道我做错了什么?我原以为多个类可以具有相同的初始化程序名称,但也许不是这样。