0

我有一个类“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 提前谢谢

4

1 回答 1

0

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

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

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

于 2012-11-10T16:12:52.870 回答