0

目前我正在使用带有 ARC 的 Xcode 4.2。

下面是我的代码

.h 文件

@property (readonly, nonatomic) NSString *username;

.m 文件

@synthesize  username = _username;

我在这样的 .m 文件中出现错误

ARC 禁止合成具有未指定所有权或存储属性的objective-c 对象的属性

4

7 回答 7

3

当您为对象创建属性时,您需要指定将使用的内存管理语义。assign用于数字上的标量值,例如结构,但字符串是对象,因此您需要指定它是weak、 或strong还是copy

strongretain是非 ARC 代码中的 ARC 等价物。它表示该属性将保持对该对象的强引用。

weak特定于 ARC。这意味着虽然该属性有一个对象引用,但它并没有保留它。此外,如果对象被释放,引用将变为nil. 例如,在存储对委托的引用时会使用此方法。

copy意味着该属性将持有对该对象副本的强引用。如果您持有可能在类外更改的引用,这将特别有用。

不管其他答案怎么说,你应该使用copyfor 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

所以现在,在你的班级里;您可以读取和写入该属性,但在外部,其他类只能读取该属性。

于 2013-10-23T10:43:40.853 回答
1
@property (nonatomic, strong) NSString *userName;

在 ARC 中,它会自动释放指针变量内存...

于 2013-10-26T12:11:06.787 回答
0

请在下面尝试:

      @property (nonatomic,strong) NSString 
      *username;
于 2013-10-22T12:58:24.953 回答
0

将您的财产声明更改为:

@property (nonatomic,strong)  NSString *username;

以便 ARC 知道应该保留它。这将在 ARC 之前编译,但它会很危险,因为默认值是assign并且颜色会被释放,除非它被保留在其他地方。

我强烈推荐关于 ARC 的 WWDC2011 视频。

于 2013-10-22T12:58:34.517 回答
0

在.h文件中试试这个

@property (strong, nonatomic) NSString *username;
于 2013-10-22T12:59:03.903 回答
0

在用 arc 编写时,您应该声明 ivar 是强还是弱。

于 2013-10-22T13:22:06.533 回答
0

在 ARC 分配中,它将在任何地方发布。对于指针变量“强”只会更舒服。我通过以下行修改了 .h 文件中的代码

@property (nonatomic, strong) NSString *username;
于 2013-10-22T13:50:44.063 回答