这是一个允许用户标记事物的应用程序。标签只是字符串。
对象数组TagHolder包含应用程序中正在使用的所有标签的列表,并带有一个布尔值来告知是否选择了标签,但这是一个实现细节。
外部接口调用两个方法,selectedTags,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,但我想这个问题在手动保留计数的环境中是相同的。