是否有必要在手动保留 - 释放模式下合成/释放弱属性

时间:2013-11-02 18:10:55

标签: ios objective-c memory-management

例如,我子类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

2 个答案:

答案 0 :(得分:6)

仅当启用ARC(或GC)时,

weak才是有效的属性属性。

您可以切换到ARC(强烈建议)或改为使用assignunsafe_unretained属性,但代价是会失去weak引用的好处(请参阅{{3 }})

话虽如此,我认为assignweak在特定情况下都无法实现任何可取的目标。

除非你真的想避免强烈引用该字符串,否则相应的属性声明将如下所示:

@property (nonatomic, copy) NSString *myString;

关于copy而非retain(或strong)的原因,您可以阅读Whats the difference between 'weak' and 'assign' in delegate property declaration

答案 1 :(得分:0)

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

@property (copy) NSString *myString;

第一条评论:是的。 (非原子,复制)没问题。

第二条评论:你不需要,在现代的objective-c语法中也是如此。将以任一方式创建_myString ivar。是的,如果您使用_myString

,则需要发布copy