实际上我来自java背景,我正在学习目标c我对目标C的奇怪行为感到非常困惑。“请阅读第三个问题,它很重要。”
问题是按顺序提供的,所以请按我和其他人可以理解的顺序给出答案。
问题 1
我有两个类派生自NSObject
:A
和B
:
@interface A : NSObject
@end
@interface B : NSobject
-(void)display; // It displays "I am class B"
@end
现在,如果我这样做:
A *a = [[B alloc]init]; // Show warning not error (it must be illegal)
[a display]; // prints "I am class B"
它调用了B类的显示方法。我认为它不应该发生,因为:
A
没有方法display
。通过多态性。这可能是一个安全威胁,因为我正在创建任何类的引用并传递任何另一个类的对象并通过它访问数据。
Dog
当类实例获取类的对象时可能存在设计问题Printer
,现在我正在实例上调用print
方法。Dog
我已经引用
NSArray
并传递了对象,NSMutableArray
现在我NSMutableArray
在这个实例上调用方法。[nsarr addObject:@:abc]; //看起来很奇怪
问题 2
如果我有Foo
协议并且如果任何课程没有确认它。不应允许在协议引用中获取该类的对象。
@protocol Foo
@required
-(void)abc;
@end
如果我打电话:
id<Foo> obj= [[B alloc]init]; // Shows warning ignore it for now as it must be illegal also
[obj display]; // It will call display method which should be illegal
- 它不应该发生,因为
B
不符合协议Foo
并且obj
正在获取B
对象并调用B
实例方法。由于多态性和安全性,我认为它非常糟糕
问题 3
如果我的类有一个类方法返回该类的未自动释放的对象,编译器会显示警告。如果我将该类(不符合协议)方法返回的对象传递给协议的引用。(它应该是一个错误)。
id<Foo> obj = [Abc aClassMethodReturnsObjectWhichNotAutoreleased]; //show warning
它显示了一个很好的警告。 Abc
不符合协议Foo
但
id<Foo> obj = [NSArray arrayWithObjects:@"abc",@"def",nil]; // It does **not** show a warning as it will return autorelease object. NSArray doesn't conform protocol Foo
为什么上述对NSArray
类的分配没有像上一个示例中显示的那样显示警告。
提前致谢。
编辑
*回答第三个问题: *由于 NSArray 返回 id 对象,这将允许传入“id obj”,但在“aClassMethodReturnsObjectWhichNotAutoreleased”情况下,该方法返回“ABC *”指针,这就是编译器在这种情况下发出警告的原因。