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

问题描述 投票:0回答:7

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

以下是我的代码

.h文件

@property (readonly, nonatomic) NSString *username;

.m文件

@synthesize  username = _username;

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

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

objective-c
7个回答
1
投票
@property (nonatomic, strong) NSString *userName;

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


3
投票

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

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

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

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

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

正确的声明应该是:

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

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

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

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

@end

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


0
投票

将您的财产声明更改为:

@property (nonatomic,strong)  NSString *username;

所以ARC知道应该保留它。这可能会在ARC之前编译,但是它会很危险,因为默认值是assign,颜色会被释放,除非它被保留在别处。

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


0
投票

在.h文件中试试这个

@property (strong, nonatomic) NSString *username;

0
投票

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


0
投票

请尝试以下:

      @property (nonatomic,strong) NSString 
      *username;

0
投票

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

@property (nonatomic, strong) NSString *username;
© www.soinside.com 2019 - 2024. All rights reserved.