我在@pronthesize @property变量中遇到错误

时间:2013-10-22 12:54:57

标签: objective-c

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

以下是我的代码

.h文件

@property (readonly, nonatomic) NSString *username;

.m文件

@synthesize  username = _username;

我这样的.m文件出错了

  

ARC禁止使用未指定的所有权或存储属性

合成objective-c对象的属性

7 个答案:

答案 0 :(得分:3)

在为Object创建属性时,需要指定将使用的内存管理语义。 assign用于数字上的标量值,例如结构,但字符串是对象,因此您需要指定它是weak,还是strongcopy。< / p>

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

weak特定于ARC。这意味着尽管该属性具有对象引用,但它并没有保留它。此外,如果对象被释放,则引用将变为nil。例如,在存储对委托的引用时使用它。

copy表示该属性将对该对象的副本进行强引用。如果您持有可能在课堂外更改的引用,这将特别有用。

尽管其他答案已经说过,但您应该copy使用NSStringNSArrayNSSetNSDictionary。这是因为这些类是类集群的一部分,它具有可变的对应物。例如NSMutableString等。这意味着虽然你认为你有一个不可变对象,但它实际上可能是一个可变对象。因此,将属性设置为副本意味着在您不知情的情况下不太可能从您的下方进行更改。

正确的声明应该是:

@property (copy, readonly, nonatomic) NSString *username;

奇怪的是,你需要为readonly属性指定一个内存管理说明符,我同意。这可能会在未来发生变化,属性的其他方面也会发生变化(自动合成,自动创建支持iVars等)。但是,这意味着通过在.m文件的类扩展中重新声明它,可以更容易地在类的私有实现中对属性进行读写:

// in the .m file
@interface YourClass ()

@property (copy, readwrite, nonatomic) NSString *username;

@end

现在,在你的课堂上;您可以读取和写入属性,但在外部,其他类只能读取属性。

答案 1 :(得分:1)

@property (nonatomic, strong) NSString *userName;

在ARC中它自动释放指针变量存储器......

答案 2 :(得分:0)

请尝试以下:

      @property (nonatomic,strong) NSString 
      *username;

答案 3 :(得分:0)

将您的财产声明更改为:

@property (nonatomic,strong)  NSString *username;

以便ARC知道应该保留它。这可能会在ARC之前进行编译,但由于默认值为assign并且除非在其他位置保留,否则颜色会被释放,这样会很危险。

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

答案 4 :(得分:0)

.h 文件

中尝试此操作
@property (strong, nonatomic) NSString *username;

答案 5 :(得分:0)

在弧形写作时,你应该声明ivar是强还是弱。

答案 6 :(得分:0)

在ARC分配中,它将在任何地方发布。对于指针变量“强”只会更舒服。我通过下面的行

修改了.h文件中的代码
@property (nonatomic, strong) NSString *username;