2012-02-26 20 views
5

मैं एआरसी के तरीके को समझने की कोशिश कर रहा हूं, और जहां तक ​​मुझे पता है, मुझे यहां कुछ गलत करना चाहिए। इस कोड को मैं उपयोग कर रहा हूँ है:आईओएस एआरसी - कमजोर और मजबूत गुण

इंटरफ़ेस:

@interface ViewController : UIViewController{ 

} 

@property (strong, nonatomic) NSString * myString ; 
@property (weak, nonatomic) NSString * myPointer ; 

कार्यान्वयन:

- (void)viewDidLoad{ 

    [super viewDidLoad]; 
    self.myString = @"Hello world!" ; // myString is strong 
    self.myPointer = self.myString ; // myPointer var is weak 

    [self performSelector:@selector(makeNilMyValue) withObject:nil afterDelay:1];  
    [self performSelector:@selector(printValues) withObject:nil afterDelay:2];  
} 

- (void) makeNilMyValue{ 
    self.myString = nil ; 
} 

- (void) printValues{ 
    NSLog(@"myString: %@", self.myString) ; 
    NSLog(@"myPointer: %@", self.myPointer) ; 
} 

इस क्रियान्वित करने के बाद, मैं मिलता है:

2012-02-26 11:40:41.652 test1[933:207] myString: (null) 

2012-02-26 11:40:41.653 test1[933:207] myPointer: Hello world! 

हैं मैं गलत नहीं हूँ, मेरे सूचक के कारण है कमजोर, यह वस्तु की सामग्री को बनाए रखना नहीं चाहिए। तो, इसे "हैलो वर्ल्ड!" के बजाय शून्य दिखाना चाहिए।

मैं क्या गलत कर रहा हूं?

कालेब के जवाब के बाद, मैं एक कमजोर सूचक बनाया है, नीचे दिए गए कोड देखें:

- (void)viewDidLoad{ 
    [super viewDidLoad]; 
    self.myString = @"Hello world!" ; // myString is strong 
    self.myPointer = self.myString ; // myPointer var is weak 
    self.myPointer2 = self.myString ; // myPointer2 var is weak 

    [self performSelector:@selector(makeNilMyValue) withObject:nil afterDelay:1];  
    [self performSelector:@selector(printValues) withObject:nil afterDelay:2];  
} 

- (void) makeNilMyValue{ 
    self.myPointer2 = @"value changed!" ; 
    self.myString = nil ; 

} 

- (void) printValues{ 
    NSLog(@"myString: %@", self.myString) ; 
    NSLog(@"myPointer: %@", self.myPointer) ; 
} 

बात यह है कि मैं अभी भी एक ही जवाब मैं किया करते थे मिल गया:

2012-02-26 12:08:13.426 test1[1333:207] myString: (null) 
2012-02-26 12:08:13.427 test1[1333:207] myPointer: Hello world! 

उत्तर

8

जैसा कि कालेब ने बताया, इस उदाहरण के लिए निरंतर एनएसएसटींग का उपयोग करना एक अच्छा विचार नहीं है।

स्रोत कोड में एक स्ट्रिंग वस्तु बनाने के लिए सबसे आसान तरीका ऑब्जेक्टिव-सी @ "..." निर्माण का उपयोग करने के लिए है:

NSString * अस्थायी = @ "/ tmp/खरोंच"; ध्यान दें कि, इस फ़्रेम में स्ट्रिंग स्थिर बनाते समय, आपको 7-बिट ASCII वर्णों के अलावा कुछ भी उपयोग करने से बचना चाहिए। ऐसी वस्तु संकलन समय पर बनाई गई है और आपके प्रोग्राम के निष्पादन में मौजूद है। कंपाइलर ऐसी ऑब्जेक्ट प्रति-मॉड्यूल आधार पर अद्वितीय स्थिरांक बनाता है, और उन्हें कभी भी हटाया नहीं जाता है, यद्यपि आप उन्हें बनाए रख सकते हैं और उन्हें छोड़ सकते हैं क्योंकि आप कोई अन्य ऑब्जेक्ट करते हैं। आप किसी भी अन्य स्ट्रिंग को सीधे संदेश भेज सकते हैं:

BOOL समान = [@ "तुलना" isqualToString: myString];

documentation बताता है कि निरंतर तार कभी गायब नहीं होंगे।

अपने प्रयोग के लिए कुछ और उपयोग करने का प्रयास करें। मैंने NSObject की कोशिश की और यह अपेक्षित परिणाम उत्पन्न किया।

इंटरफ़ेस:

@interface ViewController : UIViewController 

@property (strong, nonatomic) NSObject * myString; 
@property (weak, nonatomic) NSObject * myPointer; 

@end 

कार्यान्वयन:

@implementation ViewController 

@synthesize myString = _myString; 
@synthesize myPointer = _myPointer; 

- (void)viewDidLoad{ 

    [super viewDidLoad]; 

    self.myString = [[NSObject alloc] init]; 
    self.myPointer = self.myString; 
    self.myString = nil; 
    NSLog(@"myString: %@", self.myString); 
    NSLog(@"myPointer: %@", self.myPointer); 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
} 

@end 

कमजोर संकेत नहीं के बराबर की तैयारी में हैं जब वहाँ स्मृति के लिए कोई मजबूत संकेत दिए गए दस्तावेज में बताया गया है कर रहे हैं - Apple Developer या llvm

__weak एक संदर्भ निर्दिष्ट करता है जो संदर्भित वस्तु को जीवित नहीं रखता है। ऑब्जेक्ट के संदर्भों के मजबूत होने पर एक कमजोर संदर्भ शून्य पर सेट होता है।

+0

शानदार उत्तर, बहुत धन्यवाद। – RGML

5

तो, इसे "हैलो वर्ल्ड!" के बजाय शून्य दिखाना चाहिए।

लगातार तारों को कभी भी हटाया नहीं जाता है, इसलिए आपका '@ "हैलो वर्ल्ड!" कभी नहीं चला जाता है। यही कारण है कि आपका कमजोर संदर्भ कभी भी शून्य पर सेट नहीं होता है।

+0

आपके उत्तर कैलेब के लिए धन्यवाद। यह समझ में आता है, हालांकि, मैंने जो कहा है उसका परीक्षण करने के लिए मैंने एक और कमजोर सूचक बनाया है। दुर्भाग्यवश, जैसा कि आप देख सकते हैं, यह काम नहीं करता है। – RGML

+0

@Arkyxperience आप क्या होने की उम्मीद कर रहे हैं? – Caleb

+5

कमजोर संदर्भ शून्य पर सेट होते हैं जब उनके लक्ष्य को हटा दिया जाता है। यह एआरसी की एक विशेषता है - संश्लेषित कमजोर गुणों में कभी भी एक खतरनाक सूचक नहीं होगा। – FellowMD