2012-05-25 33 views
5

Đây là ứng dụng cho phép người dùng gắn thẻ mọi thứ. Thẻ chỉ là chuỗi.Ngữ nghĩa bộ nhớ của thuộc tính mảng được tính toán?

Một mảng gồm TagHolder đối tượng chứa danh sách tất cả các thẻ được sử dụng trong ứng dụng, với boolean thông báo nếu thẻ được chọn, nhưng đây là chi tiết triển khai.

Giao diện bên ngoài gọi hai phương thức, selectedTagssetSelectedTags: trả về và chấp nhận một mảng chuỗi.

Tôi muốn hai phương thức này hoạt động như người truy cập cho thuộc tính được khai báo selectedTags.

Bây giờ, câu hỏi của tôi là:

Điều gì sẽ là ngữ nghĩa quản lý bộ nhớ đúng để khai báo cho tài sản đó?

Các mẫu mã mà tôi có trong tâm trí là thế này (mã chưa được thử nghiệm, vì vậy xin vui lòng chịu với lỗi chính tả):

@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 

nên memorytype được gì? Rõ ràng là không mạnh hoặc yếu, nhưng tôi nghĩ nó có thể là bất kỳ một trong số assign, copy hoặc thậm chí unsafe_unretained, nhưng cái nào là đúng nhất cho thuộc tính được tính với giá trị đối tượng?

Tôi thường sử dụng ARC, nhưng tôi đoán câu hỏi là giống nhau trong một môi trường có số lần giữ thủ công.

Trả lời

6

memorytype chỉ có ý nghĩa khi bạn @synthesize người truy cập thuộc tính của bạn. Vì bạn đang cung cấp việc triển khai của riêng bạn cho cả trình khởi động và trình thiết lập, những thứ bạn đặt trong dấu ngoặc đơn sau @property sẽ bị bỏ qua; Tôi thường đặt readonly hoặc readwrite ở đó, chỉ để nhắc nhở bản thân về loại quyền truy cập nào có sẵn trên các thuộc tính này.

Mã của bạn là chính xác, mã này sẽ hoạt động mà không tạo sự cố bộ nhớ có hoặc không có ARC.

Các vấn đề liên quan