在 XCode 4.6.2 ARC 中,如果您在名为 'retain' 的类中有一些属性,IDE 或编译堆栈都会做一些有趣的事情,使该类不能以通常的模式使用:[[MyClass alloc] init]
.
例如,如果我将 Foo 类定义为
// Foo.h
#import <Foundation/Foundation.h>
@interface MosquittoMessage : NSObject
@property (nonatomic, assign) BOOL retain;
-(id)init;
@end
// Foo.m
#import "Foo.h"
@implementation MosquittoMessage
-(id) init
{
self = [super init];
return self;
}
@end
它将编译并运行,但是,我不能使用
Foo *foo = [[Foo alloc] init];
创建 foo。上面的运行时语句会将 foo 设置为 nil。我使用调试器跟踪问题,发现 alloc 实际上返回了一个有效的 Foo,但在 init 内部,由于某种原因它被释放,返回的 self 为 nil。
有人对 XCode 或编译系统中的这个“错误”有任何想法吗?
添加:
当然'retain'在Obj-C中被保留,我的问题是如果不允许编译器为什么不抱怨?相反,它生成了错误的代码。