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)
?:)
我尝试了,我没有得到任何警告,只是想知道它是否可以做到?
这是允许的; 但是你应该记住两件事:
+alloc没有链接-init或者使用链接的情况下打电话-initWith*,除非你正在讨论运行时.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属性将无法正常工作(但编译器会向您发出警告.).