【问题标题】:Is it possible or necessary to synthesize/release weak property in manual retain-release mode是否可以或有必要在手动保留释放模式下合成/释放弱属性
【发布时间】:2013-11-13 17:41:24
【问题描述】:

例如,我将UIView 子类化,其中定义了一个名为myString 的弱属性。 @synthesize myString = _myString; 语句有错误消息:Semantic Issue: @synthesize of 'weak' property is only allowed in ARC or GC mode

MyUIView.h 文件:

@interface MyUIView : UIView

@property (nonatomic, weak) NSString *myString;

@end

MyUIView.m 文件:

#import "MyUIView.h"

@implementation MyUIView

@synthesize myString = _myString; // This statement causes an error whose message is Semantic Issue: @synthesize of 'weak' property is only allowed in ARC or GC mode

- (void)dealloc
{
    [_myString release];

    [super dealloc];
}

// Other methods

@end

然后我删除了@synthesize myString = _myString;,这条语句[_myString release]; 出现了另一个错误Semantic Issue: Use of undeclared identifier '_text'

如果不需要像上面myString这样的弱属性合成和释放,我是否应该像这样重写代码:

MyUIView.h 文件:

@interface MyUIView : UIView

@property (nonatomic, weak) NSString *myString;

@end

MyUIView.m 文件:

#import "MyUIView.h"

@implementation MyUIView

- (void)dealloc
{        
    [super dealloc];
}

// Other methods

@end

【问题讨论】:

  • 读取错误。 @synthesize of 'weak' property is only allowed in ARC。该文件未在启用 ARC 的情况下进行编译。
  • 是否有特殊原因声明该属性为弱?
  • 一个名为 label 但不是 UILabel 的属性:命名不佳。
  • 致@MartinR,上面的代码是另一个人写的,我猜是用ARC写的。但我想将其更改为手动保留释放样式。
  • 致@vikingosegundo,属性名称已从label 更改为myString:D

标签: ios objective-c memory-management


【解决方案1】:

NSString(以及任何其他具有可变子类的不可变类)应合成为copy

@property (copy) NSString *myString;

第一条评论:是的。 (非原子,副本)很好。

第二条评论:你不需要,现代的objective-c语法也假设它。无论哪种方式,都会创建一个_myString ivar。是的,如果你使用copy,你需要释放_myString

【讨论】:

  • 将“copy”与 NSString 属性一起使用总是有意义的。这与 ARC 与手动引用计数无关。
  • 致@JesseNaugher,我可以将nonatomiccopy 同时使用为@property (nonatomic, copy) NSString *myString;吗?
  • 致@JesseNaugher,如果我对属性myString 使用copy 属性,是否需要@synthesize myString = _myString(我知道这是默认设置,所以我的意思是会有默认设置@987654333 @ivar made for the property with copy 属性?)如果有_myString ivar made,我需要在dealloc方法中[_myString release]吗?
  • “除非另有说明,否则属性被假定为非原子的” - 这是不正确的。默认值为“原子”(不幸的是)。
  • 致@JesseNaugher,在你的第一句话中,“以及任何其他具有可变子类的不可变类”,你的意思是,例如,如果我想要一个NSArray类中的属性,应该合成为copy,因为有NSMutableArray。那么如果存在“可变”子类,为什么它应该总是copy
【解决方案2】:

weak 仅在启用 ARC(或 GC)时才有效。

您可以切换到 ARC(强烈建议)或改用 assignunsafe_unretained 属性,代价是失去 weak 引用的好处(请参阅 Whats the difference between 'weak' and 'assign' in delegate property declaration

话虽如此,我认为assignweak 在特定情况下都不会完成任何理想的事情。

除非您真的想避免对该字符串的强引用,否则适当的属性声明应如下所示:

@property (nonatomic, copy) NSString *myString;

关于为什么copy 而不是retain(或strong),您可以阅读NSString property: copy or retain?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    相关资源
    最近更新 更多