【发布时间】:2011-05-03 01:45:31
【问题描述】:
我发现了一个奇怪的场景,它在 XCode 中产生了一个我认为不是有效警告的编译器警告。
作为示例,我创建了两个类,ClassA 和 ClassB,它们都有一个名为 -initWithSomething 的 init 方法: 一个将 (NSDate *) 作为“某物”,另一个将 (NSString *)
A 类
// ClassA.h
#import <Foundation/Foundation.h>
@interface ClassA : NSObject {
}
-(id)initWithSomething:(NSDate *)something;
@end
// ClassA.m
#import "ClassA.h"
@implementation ClassA
-(id)initWithSomething:(NSDate *)something {
if (self = [super init]) {
}
return self;
}
@end
B 类
// ClassB.h
#import <Foundation/Foundation.h>
@interface ClassB : NSObject {
}
-(id)initWithSomething:(NSString *)something;
@end
// ClassB.m
#import "ClassB.h"
@implementation ClassB
-(id)initWithSomething:(NSString *)something {
if (self = [super init]) {
}
return self;
}
@end
实现另一个同时使用 ClassA 和 ClassB 的类
#import "ExampleClass.h"
#import "ClassA.h"
#import "ClassB.h"
@implementation ExampleClass
-(void)doSomething {
NSDate *date = [NSDate date];
NSString *string = [NSString stringWithFormat:@"Test"];
ClassA *classA = [[ClassA alloc] initWithSomething:date];
ClassB *classB = [[ClassB alloc] initWithSomething:string]; // Produces "Incompatible pointer types sending 'NSString *' to parameter of type 'NSDate *'
ClassB *classB2 = [[ClassB alloc] initWithSomething:[NSString stringWithFormat:@"Test"]]; // Does NOT produce a warning
ClassB *classB3 = [[ClassB alloc] initWithSomething:@"Test"]; // Produces the same warning as above.
[classA release];
[classB release];
[classB2 release];
[classB3 release];
}
这是编译器错误吗?似乎这些行中的任何一行都不应该产生警告,特别是因为“classB2”被初始化的行没有产生警告。
这段代码实际上运行良好,正确的类'-initWithSomething: 被调用并传递了适当类型的参数。
显然,更明确的方法名称可以避免这个问题,但我想知道为什么编译器无法处理这个问题。
注意: 我应该补充一点,这似乎只发生在 -init 方法中,任何其他实例或类函数似乎都不会产生警告。
【问题讨论】:
-
我不知道为什么有人会否决这个问题,这是个好问题
标签: objective-c xcode