मेरा अनुमान है कि संकलक संस्करण जो आप उपयोग कर रहे हैं, घोषित संपत्तियों के लिए स्मृति प्रबंधन नियमों का पालन करते हैं, और भी - विशेष रूप से, घोषित संपत्तियों के लिए:
यदि आप एक ऐसी विधि का उपयोग करते हैं, जिसका नाम "आवंटित", "नया", "प्रतिलिपि", या "उत्परिवर्ती" के साथ शुरू होता है, तो आप किसी वस्तु का स्वामित्व लेते हैं।
newTitle
संश्लेषित होने पर नाम की एक संपत्ति , नामक विधि उत्पन्न करती है -newTitle
, इसलिए चेतावनी / त्रुटि। संपत्ति के -newTitle
लिए एक गेटर विधि माना जाता है newTitle
, हालांकि नामकरण परंपराओं में कहा गया है कि एक विधि जिसका नाम new
रिटर्न ऑब्जेक्ट के स्वामित्व वाले ऑब्जेक्ट के साथ शुरू होता है , जो कि गेट्टर विधियों का मामला नहीं है।
आप इसे इसके द्वारा हल कर सकते हैं:
उस संपत्ति का नामकरण:
@property (strong, nonatomic) NSString *theNewTitle;
प्रॉपर्टी का नाम रखना और एक गेटर का नाम निर्दिष्ट करना जो किसी विशेष विधि के नाम उपसर्गों से शुरू नहीं होता है:
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
प्रॉपर्टी का नाम और गेट्टर दोनों का नाम, और कंपाइलर को यह बताते हुए कि, भले ही गेटर का नाम शुरू होता है new
, यह none
विधि परिवार के विपरीत new
विधि परिवार से संबंधित है:
#ifndef __has_attribute
#define __has_attribute(x) 0 // Compatibility with non-clang compilers
#endif
#if __has_attribute(objc_method_family)
#define BV_OBJC_METHOD_FAMILY_NONE __attribute__((objc_method_family(none)))
#else
#define BV_OBJC_METHOD_FAMILY_NONE
#endif
@interface ViewController : UIViewController
@property (strong, nonatomic) NSString *newTitle;
- (NSString *)newTitle BV_OBJC_METHOD_FAMILY_NONE;
@end
ध्यान दें कि भले ही यह समाधान आपको newTitle
संपत्ति के नाम और गेट्टर नाम दोनों के रूप में रखने की अनुमति देता है , जिसमें एक विधि है जिसे -newTitle
कॉल करने वाले के पास कोई वस्तु वापस नहीं आती है, जो आपके कोड को पढ़ने वाले अन्य लोगों के लिए भ्रमित हो सकता है।
रिकॉर्ड के लिए, Apple ने ARC रिलीज़ नोट्स में संक्रमण प्रकाशित किया है , जिसमें वे कहते हैं:
आप किसी प्रॉपर्टी को एक ऐसा नाम नहीं दे सकते जो उसके साथ शुरू हो new
या copy
।
उन्हें पहले से ही सूचित कर दिया गया है कि उनका बयान बिल्कुल सटीक नहीं है: अपराधी गेट्टर विधि नाम है, संपत्ति नाम नहीं।
17 जनवरी 2015 को संपादित करें: मैंने अभी हाल ही में क्लैंग के लिए एक प्रतिबद्ध कमेंट पर ध्यान दिया है, जो 3 विकल्प (ऊपर objc_method_family(none)
) का उपयोग करता है , एक फिक्स- इट सहित, सामान्य मामले के लिए जहां एक संपत्ति का नाम विशेष विधि परिवार के उपसर्गों में से एक से मेल खाता है। Xcode संभवतः इस बदलाव को शामिल करेगा।