例如,我子类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
答案 0 :(得分:6)
weak
才是有效的属性属性。
您可以切换到ARC(强烈建议)或改为使用assign
或unsafe_unretained
属性,但代价是会失去weak
引用的好处(请参阅{{3 }})
话虽如此,我认为assign
和weak
在特定情况下都无法实现任何可取的目标。
除非你真的想避免强烈引用该字符串,否则相应的属性声明将如下所示:
@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