【问题标题】:object not confirming protocol does not give any warning对象不确认​​协议不给出任何警告
【发布时间】:2012-11-10 16:09:30
【问题描述】:

我有一个“ABC”类及其返回该类的非自动释放对象的方法。

@interface ABC:NSObject
+(ABC *)aClassMethodReturnsObjectWhichNotAutoreleased;
@end  

@implementation ABC
+(ABC *)aClassMethodReturnsObjectWhichNotAutoreleased{
   ABC *a = [[ABC alloc]init];
   return a;
}
@end

如果我有一个协议 Foo.

@Protocol Foo
@required
-(void)abc;
@end

我的 ABC 课程“不”确认 Foo 协议。

第一次调用

id<Foo> obj = [ABC aClassMethodReturnsObjectWhichNotAutoreleased]; //show warning

它显示警告“不兼容的指针..”这很好。Abc 没有确认协议 Foo

但是 第二次调用

id<Foo> obj = [NSArray arrayWithObjects:@"abc",@"def",nil]; // It will "not" show warning as it will return autorelease object.NSArray don't confirm protocol Foo

在第一次调用编译器给出警告,在第二次调用编译器没有给出任何警告。我认为这是因为我没有返回自动释放对象。

为什么编译器在第二次调用中没有给出警告,因为 NSArray 也没有确认 FOO 提前致谢

【问题讨论】:

    标签: iphone objective-c ios ios5


    【解决方案1】:

    在您的第一个示例中,返回值是特定类型,因此编译器可以验证分配。

    在第二个示例中,NSArray arrayWithObjects: 方法的返回类型为 id。您可以将id 类型的对象分配给任何类型的变量。编译器无法验证您所做的事情是否真正正确。

    这个问题与自动释放的对象无关。这都是关于数据类型的。 id 是一种包罗万象的类型,可以是任何东西。

    【讨论】:

    • 既然他有id &lt;Foo&gt; obj =,它不应该仍然检查协议一致性吗?
    • 没有。您可以将id 类型的对象分配给任何对象类型的变量。编译器不做任何检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    相关资源
    最近更新 更多