为什么我在使用XCode时不能拥有名为'retain'的属性?

lua*_*nyi 1 xcode objective-c clang ios automatic-ref-counting

在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
Run Code Online (Sandbox Code Playgroud)

它会编译运行,但我不能使用

Foo *foo = [[Foo alloc] init];
Run Code Online (Sandbox Code Playgroud)

创造foo.运行时的上述语句将foo设置为nil.我使用调试器跟踪问题并发现alloc实际上返回了一个有效的Foo,但是在init中,由于某种原因它被释放,并且返回的self是nil.

任何人都对XCode或编译系统中的这个"bug"有任何想法吗?

添加:

当然'保留'是在Obj-C中保留的,我的问题是为什么编译器不抱怨它是否被允许?相反,它生成了错误的代码.

mat*_*att 5

属性只是方法调用的语法糖.所以retain属性意味着一种retain方法.但是已经有了一种retain方法,你禁止用它来调用它.

您遇到的实际情况是Objective-C中的所有内容都是一个巨大的命名空间.您不希望任何内容与已存在的内容具有相同的名称 - 您可以使名称发生冲突,并最多获得警告或最坏情况下破坏应用程序的功能.我曾经通过命名一个属性打破了我的应用程序firstResponder; 即使没有公共方法有这个名字,显然这种方法存在于幕后,我不小心颠覆了它.