对象不确认​​协议不会给出任何警告

时间:2012-11-10 16:09:30

标签: iphone objective-c ios ios5

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

@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

BUT 第二次电话

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 提前致谢

1 个答案:

答案 0 :(得分:0)

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

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

此问题与自动释放的对象无关。它是关于数据类型的全部内容。 id是一种包罗万象的类型,可以是任何东西。