एआरसी के साथ संकलन करते समय, विधि तर्क अक्सर विधि की शुरुआत में बनाए रखा जाता है और अंत में जारी किया जाता है। यह बरकरार/रिलीज जोड़ी अधूरा लगता है, और इस विचार के विपरीत है कि एआरसी "जिस कोड को आपने लिखा होगा वह उत्पन्न करता है"। उन अंधेरे में से कोई भी, पूर्व-एआरसी दिनों में सुरक्षित पक्ष पर रहने के लिए सभी विधि तर्कों पर अतिरिक्त रखरखाव/रिलीज नहीं किया गया था, है ना?एआरसी विधि तर्क क्यों बनाए रखता है?
पर विचार करें:
@interface Test : NSObject
@end
@implementation Test
- (void)testARC:(NSString *)s
{
[s length]; // no extra retain/release here.
}
- (void)testARC2:(NSString *)s
{
// ARC inserts [s retain]
[s length];
[s length];
// ARC inserts [s release]
}
- (void)testARC3:(__unsafe_unretained NSString *)s
{
// no retain -- we used __unsafe_unretained
[s length];
[s length];
// no release -- we used __unsafe_unretained
}
@end
जब रिलीज़ मोड, विधानसभा में Xcode 4.3.2 के साथ संकलित (जैसे कि मैं यह समझने में सक्षम हूँ) objc_retain
और objc_release
शुरू में और के अंत के लिए कॉल निहित दूसरी विधि क्या चल रहा है?
यह एक बड़ी समस्या नहीं है, लेकिन प्रोफ़ाइल प्रदर्शन-संवेदनशील कोड पर उपकरण का उपयोग करते समय यह अतिरिक्त बनाए रखने/रिलीज यातायात दिखाता है। ऐसा लगता है कि आप इस अतिरिक्त रखरखाव/रिलीज से बचने के लिए __unsafe_unretained
के साथ विधि तर्कों को सजाने के लिए तैयार कर सकते हैं, जैसा कि मैंने तीसरे उदाहरण में किया है, लेकिन ऐसा करने से काफी घृणित लगता है।
कोई विचार क्यों यह पहले उदाहरण में नहीं होता है? – Thilo
आप हमेशा डिस्सेप्लोर सहायक दृश्य का उपयोग करके वास्तविक जेनरेट कोड देख सकते हैं। – Danra