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

标签 ios objective-c xcode automatic-ref-counting clang

在 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/

相关文章:

ios - 并行执行 Xcode 10 UI 测试时禁用模拟器的连接硬件键盘设置

objective-c - 从 XCode 项目连接到 Oracle 数据库

javascript - 用于检测仅触摸设备的 jQuery 解决方案?

objective-c - XCode 项目 : how to build sub-projects as static libraries?

ios - 调整 UITableViewCell 的大小会自动调整其 contentView 的大小吗?

iphone - 在 Objective C 中从本地文件夹中读取图像

ios - 排序用户位置 iOS

xcode - 如何创建具有较小 View 的xib文件?

ios - 如何在这样的代码中绘制可调整大小的 UIImage?

ios - MKMapView - 有没有办法将 MKUserTrackingModeFollow 与修改的中心/焦点一起使用?