我有一个类“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 提前致谢
答案 0 :(得分:0)
在第一个示例中,返回值是特定类型,因此编译器可以验证赋值。
在第二个示例中,NSArray arrayWithObjects:
方法的返回类型为id
。您可以将类型为id
的对象分配给任何类型的变量。编译器无法验证您所做的事情是否真正正确。
此问题与自动释放的对象无关。它是关于数据类型的全部内容。 id
是一种包罗万象的类型,可以是任何东西。