目前我正在使用带有 ARC 的 Xcode 4.2。
下面是我的代码
.h 文件
@property (readonly, nonatomic) NSString *username;
.m 文件
@synthesize username = _username;
我在这样的 .m 文件中出现错误
ARC 禁止合成具有未指定所有权或存储属性的objective-c 对象的属性
目前我正在使用带有 ARC 的 Xcode 4.2。
下面是我的代码
.h 文件
@property (readonly, nonatomic) NSString *username;
.m 文件
@synthesize username = _username;
我在这样的 .m 文件中出现错误
ARC 禁止合成具有未指定所有权或存储属性的objective-c 对象的属性
当您为对象创建属性时,您需要指定将使用的内存管理语义。assign
用于数字上的标量值,例如结构,但字符串是对象,因此您需要指定它是weak
、 或strong
还是copy
。
strong
retain
是非 ARC 代码中的 ARC 等价物。它表示该属性将保持对该对象的强引用。
weak
特定于 ARC。这意味着虽然该属性有一个对象引用,但它并没有保留它。此外,如果对象被释放,引用将变为nil
. 例如,在存储对委托的引用时会使用此方法。
copy
意味着该属性将持有对该对象副本的强引用。如果您持有可能在类外更改的引用,这将特别有用。
不管其他答案怎么说,你应该使用copy
for NSString
, NSArray
, NSSet
, NSDictionary
。这是因为这些类是类簇的一部分,它们具有可变的对应物。例如NSMutableString
等。这意味着虽然你认为你有一个不可变的对象,但它实际上可能是一个可变的对象。因此,将属性设置为副本意味着它不太可能在您不知情的情况下被您更改。
正确的声明应该是:
@property (copy, readonly, nonatomic) NSString *username;
我同意,您需要为只读属性指定内存管理说明符,这很奇怪。将来这可能会改变,属性的其他方面已经改变(自动合成、自动创建支持 iVar 等)。但是,这意味着通过在 .m 文件的类扩展中重新声明属性,更容易在类的私有实现中使您的属性读写:
// in the .m file
@interface YourClass ()
@property (copy, readwrite, nonatomic) NSString *username;
@end
所以现在,在你的班级里;您可以读取和写入该属性,但在外部,其他类只能读取该属性。
@property (nonatomic, strong) NSString *userName;
在 ARC 中,它会自动释放指针变量内存...
请在下面尝试:
@property (nonatomic,strong) NSString
*username;
将您的财产声明更改为:
@property (nonatomic,strong) NSString *username;
以便 ARC 知道应该保留它。这将在 ARC 之前编译,但它会很危险,因为默认值是assign
并且颜色会被释放,除非它被保留在其他地方。
我强烈推荐关于 ARC 的 WWDC2011 视频。
在.h文件中试试这个
@property (strong, nonatomic) NSString *username;
在用 arc 编写时,您应该声明 ivar 是强还是弱。
在 ARC 分配中,它将在任何地方发布。对于指针变量“强”只会更舒服。我通过以下行修改了 .h 文件中的代码
@property (nonatomic, strong) NSString *username;