5

これは、ユーザーがタグ付けできるアプリ用です。タグは単なる文字列です。

オブジェクトの配列はTagHolder、アプリで使用されているすべてのタグのリストを保持し、タグが選択されているかどうかをブール値で示しますが、これは実装の詳細です。

外部インターフェイスは、文字列の配列を返したり受け取ったりするselectedTagsとの 2 つのメソッドを呼び出します。setSelectedTags:

これら 2 つのメソッドを、宣言されたプロパティのアクセサーとして機能させたいと考えています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を使用していますが、手動保持カウントの環境でも質問は同じだと思います。

4

1 に答える 1

6

memorytype@synthesizeプロパティアクセサーを使用する場合にのみ重要です。ゲッターとセッターの両方に独自の実装を提供しているため、その後に括弧を付けたもの@propertyは無視されます。私は通常、これらのプロパティで利用できるアクセスの種類を思い出すために、readonlyまたはreadwriteそこに置きます。

あなたのコードは正しいです.ARCの有無にかかわらずメモリの問題を引き起こすことなく動作します.

于 2012-05-25T17:25:14.117 に答える