比方说,我有一个叫做类SomeClass与string属性名称:
@interface SomeClass : NSObject
{
NSString* name;
}
@property (nonatomic, retain) NSString* name;
@end
Run Code Online (Sandbox Code Playgroud)
我知道可能会指定名称,NSMutableString在这种情况下,这可能会导致错误的行为.
copy而不是retain?我在int,BOOL等上看到了与非原子,assign相同的readwrite.
我对此感到困惑.我知道在非本机对象上,我们通常做非原子的,保留.
注意:这是由于一些XCode beta版本中的错误已经修复.如果您遇到ARC问题,此问题和答案可能无法帮助您.
我正在将我的项目从手动引用计数迁移到ARC,并且偶然发现了一个问题:如何确保保留属性的自定义setter实际保留?
在myClass.h,我宣布了一个财产:@property (retain) NSDate *date.无论我是手动设置__strongivar还是自动生成它都无关紧要.
在实现中,我当然要@synthesize date实现一个自定义setter(或者只是下载demo Xcode项目):
- (void)setDate:(NSDate *)newDate
{
if (allowedToSetNewDate)
{
date = newDate;
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎没有保留日期,并且message sent to deallocated instance当newName(自动)发布它来自哪里时,尝试myClass.date稍后访问时提供给我(提供Zombie已启用;否则,它只是静默崩溃).
更改使用的setter date = [newDate copy]可以解决错误,但实际上并不是我想要的.删除自定义setter也有效,但显然不是必需的.
我在这里错过了什么?如何确保保留属性的自定义setter实际保留在ARC环境中?这似乎是一项基本而且常见的任务,我认为我忽略了一些非常明显的事情.
(注意:这不属于任何Apple NDA的条款,因为ARC作为LLVM的一部分公开发布)
编辑:我已经创建了一个小型Xcode项目来演示该问题并将其上传到github.随意下载并玩游戏.我的机智已经结束了(尽管我的机智今天并不是最好的,不可否认).
编辑:对于此示例项目,此问题已解决(请参阅已接受的答案).不幸的是,在我无法分享的更大的项目中,问题仍然存在.作为一种解决方法,我添加了strong复合setter的重复属性(ivars不起作用).新的自定义setter现在看起来像这样:
- (void)setDate:(NSDate *)newDate
{
if (allowedToSetNewDate)
{
self.date_arcretain = newDate; //this property is only there as a workaround. ARC properly retains it, but …Run Code Online (Sandbox Code Playgroud) 我理解我应该使用retain的原因,但为什么我应该使用assign?(除了避免保留周期)
[编辑] 所以如果我理解了Chuck在https://stackoverflow.com/questions上的答案......当我使用assign时,一旦变量超出方法的范围,变量将失去范围,就像在常规中一样C型语言行为?