在 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中被保留,我的问题是如果不允许编译器为什么不提示?相反,它生成了错误的代码。
最佳答案
属性只是方法调用的语法糖。所以一个retain
属性意味着 retain
方法。但是已经有retain
方法,ARC 禁止调用它。
您所遇到的实际情况是,Objective-C 中的所有内容都是一个巨大的命名空间。您不希望任何东西与已经存在的东西具有相同的名称 - 您可能会产生名称冲突,并在最好的情况下收到警告或在最坏的情况下破坏您的应用程序的功能。我曾经通过命名属性来破坏我的应用程序 firstResponder
;尽管没有公共(public)方法有这个名字,但显然这种方法存在于幕后,我不小心颠覆了它。
关于ios - 为什么我在使用 XCode 时不能拥有名为 'retain' 的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16513464/