Mon*_*olo 5 cocoa memory-management properties objective-c
这适用于允许用户标记内容的应用.标签只是字符串.
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
Run Code Online (Sandbox Code Playgroud)
应该memorytype是什么?显然不强或弱,但我认为它可能是任何一个assign,copy甚至是unsafe_unretained,但哪一个对于具有对象值的计算属性最正确?
我通常使用ARC,但我猜这个问题在手动保留计数的环境中是相同的.
memorytype只有你@synthesize的财产访问者才有意义.由于您为getter和setter提供了自己的实现,@property因此忽略后面括号中的内容; 我通常会在那里readonly或readwrite那里,只是为了提醒自己这些属性可以访问什么类型.
您的代码是正确的,它可以在没有ARC的情况下创建内存问题.
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |