2012-05-25 10 views
5

यह एक ऐप के लिए है जो उपयोगकर्ताओं को चीजों को टैग करने की अनुमति देता है। टैग सिर्फ तार हैं।एक गणना की गई सरणी संपत्ति का मेमोरी अर्थशास्त्र?

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 में से कोई भी हो सकता है, लेकिन ऑब्जेक्ट वैल्यू के साथ गणना की गई संपत्ति के लिए कौन सा सबसे सही है?

मैं आम तौर पर एआरसी का उपयोग करता हूं, लेकिन मुझे लगता है कि प्रश्न मैन्युअल बनाए रखने के साथ पर्यावरण में समान है।

उत्तर

6

memorytype केवल तभी महत्वपूर्ण है जब आप @synthesize अपनी संपत्ति एक्सेसर्स हैं। चूंकि आप गेटटर और सेटर दोनों के लिए अपना स्वयं का कार्यान्वयन प्रदान कर रहे हैं, इसलिए @property के बाद जो चीजें आप कोष्ठक में डालती हैं उन्हें अनदेखा किया जाता है; मैं आमतौर पर readonly या readwrite डालता हूं, बस इन गुणों पर किस प्रकार की पहुंच उपलब्ध है, मुझे याद दिलाने के लिए।

आपका कोड सही है, यह एआरसी के साथ या उसके बिना मेमोरी समस्याओं के निर्माण के बिना काम करेगा।