Objective-C子类问题

Joh*_*sen 3 iphone subclass objective-c

我有一个名为Level的类,它是NSObject的子类.

然后我有一个名为Level_1_1的类,它是Level的子类.

是否允许输入类似

Level* aLevel = [Level_1_1 alloc];
Run Code Online (Sandbox Code Playgroud)

代替

Level_1_1* theLevel = [Level_1_1 alloc];
Run Code Online (Sandbox Code Playgroud)

?:)

我尝试了,我没有得到任何警告,只是想知道它是否可以做到?

Wil*_*and 6

这是允许的; 但是你应该记住两件事:

  1. 永远不要在+alloc没有链接-init或者使用链接的情况下打电话-initWith*,除非你正在讨论运行时.
  2. 如果你打电话给类似的东西,你可能想重新考虑你的设计Level_1_1.例如,您可能想要一个泛型Level类和某种与它相关联的级别描述数据,因此您不必对每个级别进行硬编码; 如果你没有付出巨大的努力,几乎不可能完成任务.

回到这一点:

SomeClass *aSomeclass = [[MySomeClass alloc] init];
Run Code Online (Sandbox Code Playgroud)

是完全可以接受的(假设MySomeClass继承自SomeClass).事实上,如果没有你注意到,这种情况会发生很多:例如NSString,即使在通话时[[NSString alloc] init],你也从未得到过,如:

// This is an NSConstString masquerading as an NSString
NSString *aString = @"This is an NSConstString";
// This probably gives you an NSConcreteString, or something of the kind
NSString *anotherString = [NSString stringWithString:aString];
Run Code Online (Sandbox Code Playgroud)

你甚至可以为你的班级添加一个完全错误的类型.例如

NSArray *someString = @"Not An Array!";
NSLog(@"%s", [someString UTF8String]);  // this works, but creates
                                        // a compile-time warning
NSLog(@"%u", [someString count]);       // this creates a runtime error,
                                        // but none while compiling
Run Code Online (Sandbox Code Playgroud)

这个字符串实例仍然完全可用,但编译器不能再警告你有关明显的错误,因为它认为它是一个NSArray.此外,Objective-C 2.0属性将无法正常工作(但编译器会向您发出警告.).

  • 那么请在你的例子中使用`#new`它,请不要假设`#new`做什么,但在文档中查找. (2认同)