这是一个允许用户标记事物的应用程序。标签只是字符串。
一个数组TagHolder
对象保存应用程序中使用的所有标签的列表,并用一个布尔值告诉是否选择了该标签,但这是一个实现细节。
外部接口调用两个方法,selectedTags
, and setSelectedTags:
它返回并接受字符串数组。
我希望这两个方法用作已声明属性的访问器selectedTags
.
现在,我的问题是:
为该属性声明的正确内存管理语义是什么?
我想到的代码模式是这样的(代码未经测试,所以请忍受拼写错误):
@interface TagInfo : NSObject
@property (strong, nonatomic) NSString *tag;
@property (nonatomic) BOOL selected;
@end
@interface SomeClass : NSObject
@property (memorytype, nonatomic) NSArray *selectedTags;
@end
@implementation TagHolder
- (NSArray *)selectedTags
{
// tagInfoArray is an array of all TagInfo objects
NSPredicate *selPred = [NSPredicate predicateWithFormat: @"selected == YES"];
NSArray *selectedTagInfoObjects = [[self tagInfoArray] filteredArrayUsingPredicate: selPred];
NSArray *selectedTags = [selectedTagInfoObjects valueForKey: @"tag"];
return selectedTags;
}
- (void)setSelectedTags: (NSArray *)selectedTags
{
for (TagInfo *tagInfo in [self tagInfoArray]) {
tagInfo.selected = [selectedTags containsObject: tagInfo.tag];
}
}
@end
什么应该memorytype
是?显然不是强或弱,但我认为它可能是其中之一assign
, copy
甚至unsafe_unretained
,但是对于具有对象值的计算属性来说,哪一个是最正确的呢?
我通常使用 ARC,但我想在手动保留计数的环境中问题是相同的。
memorytype
仅当您@synthesize
你的属性访问器。由于您正在为 getter 和 setter 提供自己的实现,因此您在后面括号中放入的内容@property
被忽略;我通常把readonly
or readwrite
在那里,只是为了提醒自己这些属性可以使用什么样的访问权限。
您的代码是正确的,无论有或没有 ARC,它都可以工作而不会产生内存问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)