सिमेंटिक इश्यू: प्रॉपर्टी का सिंथेसाइज्ड गेट्टर 'स्वामित्व वाली' वस्तुओं को लौटाने के लिए कोको नामकरण सम्मेलन का अनुसरण करता है


283

मैं वर्तमान में अपने ऐप को विकसित करने के लिए iOS 5 SDK का उपयोग कर रहा हूं। मैं एक NSString एक संपत्ति बनाने की कोशिश कर रहा हूं, और फिर इसे .m फ़ाइल में संश्लेषित करने के लिए (मैंने पहले बिना किसी मुद्दे के साथ ऐसा किया है)। अब, मैं इस पर आया: "सिमेंटिक इश्यू: प्रॉपर्टी का सिंथेसाइज्ड गेट्टर कोको के नामकरण कन्वेंशन का मालिकाना हक़ रखता है।"

यह मेरा कोड है: .h

@interface ViewController : UIViewController {
     NSString *newTitle;
}
@property (strong, nonatomic) NSString *newTitle;

।म

@synthesize newTitle;

क्या किसी के पास कोई सुराग है कि मैं इसे कैसे ठीक कर सकता हूं? धन्यवाद!!


मेरे पास एक समान त्रुटि थी "संपत्ति 'स्वामित्व वाली वस्तुओं को वापस करने के लिए कोको के नामकरण परंपराओं का अनुसरण करती है" बावेरियस के उत्तर बोले को यह भी हल करना प्रतीत होता है।
टीएम

जवाबों:


606

मेरा अनुमान है कि संकलक संस्करण जो आप उपयोग कर रहे हैं, घोषित संपत्तियों के लिए स्मृति प्रबंधन नियमों का पालन करते हैं, और भी - विशेष रूप से, घोषित संपत्तियों के लिए:

यदि आप एक ऐसी विधि का उपयोग करते हैं, जिसका नाम "आवंटित", "नया", "प्रतिलिपि", या "उत्परिवर्ती" के साथ शुरू होता है, तो आप किसी वस्तु का स्वामित्व लेते हैं।

newTitleसंश्लेषित होने पर नाम की एक संपत्ति , नामक विधि उत्पन्न करती है -newTitle, इसलिए चेतावनी / त्रुटि। संपत्ति के -newTitleलिए एक गेटर विधि माना जाता है newTitle, हालांकि नामकरण परंपराओं में कहा गया है कि एक विधि जिसका नाम newरिटर्न ऑब्जेक्ट के स्वामित्व वाले ऑब्जेक्ट के साथ शुरू होता है , जो कि गेट्टर विधियों का मामला नहीं है।

आप इसे इसके द्वारा हल कर सकते हैं:

  1. उस संपत्ति का नामकरण:

    @property (strong, nonatomic) NSString *theNewTitle;
  2. प्रॉपर्टी का नाम रखना और एक गेटर का नाम निर्दिष्ट करना जो किसी विशेष विधि के नाम उपसर्गों से शुरू नहीं होता है:

    @property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
  3. प्रॉपर्टी का नाम और गेट्टर दोनों का नाम, और कंपाइलर को यह बताते हुए कि, भले ही गेटर का नाम शुरू होता है 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 संभवतः इस बदलाव को शामिल करेगा।


6
आकर्षण पुरुष की तरह काम किया !! धन्यवाद!!! भविष्य के संदर्भ के लिए - मैंने "@property (मजबूत, नॉनटोमिक, गेट्टर = theNewTitle) NSString * newTitle;"
नोम

8
अद्भुत जवाब। मेरे पास "नया" उपसर्ग था।

मुझे भी यह समस्या लगी है, और यह मेरा बहुत समय बर्बाद करता है! आप वास्तव में एक प्रतिभाशाली हैं ius धन्यवाद!
एच लाइ

NS_RETURNS_NOT_RETAINEDआपको भी यही चाहिए।
डॉनसॉन्ग

55

अस्वीकार्य वस्तु नाम

  • newButton
  • copyLabel
  • allocTitle

स्वीकार्य वस्तु नाम

  • neueButton
  • mCopyLabel
  • _allocTitle

# आरसी # ऑटो-संश्लेषित # एक्सकोड-4.6.1

** EDIT **

जाहिरा तौर पर आप या तो mutableCopy का उपयोग नहीं कर सकते ।


1
मैंने यह भी देखा कि "कॉपी" का उपयोग अब नहीं किया जा सकता है।
ऋषभ 12

30

नए से शुरू होने वाले सदस्य का नाम चेतावनी को ट्रिगर करता है। नाम बदलकर संपादित करें और चेतावनी चली जाएगी। मुझे इस बात की पुष्टि करने में दस्तावेज़ नहीं मिला था, लेकिन परीक्षण के माध्यम से उस सदस्य चर का निर्धारण करने में सक्षम था जो संकलक को 'नए' से शुरू करते हैं।


8

एआरसी संपत्ति के नाम पर "नया ...." का उपयोग करने की अनुमति नहीं देता है। लेकिन आप गेट्टर का नाम बदलकर "newTitle" का उपयोग कर सकते हैं।

@property (nonatomic, strong, getter=theNewTitle) NSString *newTitle;

6

यह ऐसा नहीं लगता है कि बावरियस सुझाव दे रहा था कि आप क्या करना चाहते हैं। आपको बस एक उदाहरण चर घोषित करना है NewTitleऔर फिर संपत्ति को संश्लेषित करना है। हमें उदाहरण के लिए परिवर्तनीय और संपत्ति घोषित करना पड़ता था। अब और नहीं।

अब, मेरा मानना ​​है कि ऐसा करने का सही तरीका निम्नलिखित है:

@interface ViewController : UIViewController

@property (nonatomic, strong) NSString *newTitle;

।म

@synthesize newTitle = _newTitle; // Use instance variable _newTitle for storage

संपत्ति के लिए उदाहरण चर newTitleसंश्लेषित है। आप अपने उदाहरण चर को अपनी संपत्ति के समान नहीं चाहते हैं - गलतियों को करना बहुत आसान है

उदाहरण देखें : संपत्तियों की घोषणा और एक्सेसरों का संश्लेषण


यह संकलक संस्करण पर निर्भर करता है। क्लैंग के हाल के संस्करण इस मामले में एक चेतावनी का उत्सर्जन करते हैं, यही वजह है कि मैंने अपने उत्तर में संकलक संस्करण का उल्लेख किया है।

मुझे नहीं लगता कि आपने समस्या हल की है। Xcode 9 के लिए, यह एक चेतावनी है, न कि चेतावनी। NS_RETURNS_NOT_RETAINEDआपको क्या चाहिए
डॉनसॉन्ग

4

CoreData में यदि आप विशेषता में "नया ..." का उपयोग करते हैं (सामान्य रूप से संकलित) तो यह "खराब पहुंच" अपवाद के साथ यादृच्छिक रूप से क्रैश हो जाएगा।

कोई क्रैश लॉग नहीं है और "ऑल एक्सेप्शन ब्रेकप्वाइंट" के साथ दिखाई गई लाइन आपको बिल्कुल भी मदद नहीं करेगी।


3

प्रॉपर्टी को इस चेतावनी को हटाने के नाम के साथ मैन्युअल रूप से एक सेटर लिखना।


Xcode 7.3 में, इससे मदद नहीं मिली। संपत्ति परिभाषा लाइन पर अभी भी एक त्रुटि दिखाई देती है।
अर्लोमेडिया

1

इस मुद्दे के अलावा कि आपको संपत्ति के नामों के सामने "नए" का उपयोग नहीं करना चाहिए, एक और बात बताएं: सामान्य रूप से नामों के सामने "नए" से बचने की कोशिश करें। "नया" समय पर निर्भर है। वर्तमान में यह आपके लिए नया है, लेकिन कुछ समय बाद आप शायद फिर से कुछ नया लागू करना चाहते हैं। इसलिए नामों में "नया" का उपयोग करना हमेशा बुरा होता है। इस तरह से सोचने की कोशिश करें: प्रोग्रामिंग की दुनिया में, "नया" हमेशा कुछ बना रहा है: कुछ का नया उदाहरण।

आपके मामले में जब आप एक अलग शीर्षक निर्दिष्ट करना चाहते हैं तो वर्तमान नाम आपकी संपत्ति का शीर्षक है।

एक और बात: क्रिया के साथ फ़ंक्शंस और विधियों को पहले सेट करने की कोशिश करें, जैसे सेटसोमेटिंग या गेटसमेलिंग। लेकिन गुणों में ऑब्जेक्ट को पहले नाम देने की कोशिश करते हैं, जैसे ऊँचाई वाली, सबसे ऊँची, ऊँची उड़ान, आदि -> जब आप कोडिंग करते समय अपने निरीक्षक का उपयोग करते हैं, तो आप हमेशा वस्तुओं की तलाश में रहते हैं। कोशिश करके देखो। ;-)


1

NS_RETURNS_NOT_RETAINED नामकरण समस्या को हल करने के लिए उपयोग किया जाता है।

@property (nonatomic, copy) NSString *newTitle NS_RETURNS_NOT_RETAINED;

हम इसकी परिभाषा निम्नानुसार पा सकते हैं ,

#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))

'Ns_returns_not_retain' विशेषता 'ns_returns_retain' का पूरक है। जहां एक फ़ंक्शन या विधि कोको सम्मेलनों का पालन करने और एक बनाए गए कोको ऑब्जेक्ट को वापस करने के लिए प्रकट हो सकती है, इस विशेषता का उपयोग यह इंगित करने के लिए किया जा सकता है कि लौटे गए ऑब्जेक्ट संदर्भ को "मालिक" संदर्भ के रूप में नहीं माना जाना चाहिए। फाउंडेशन फ्रेमवर्क एक मैक्रो NS_RETURNS_NOT_RETAINED को परिभाषित करता है जो कार्यात्मक रूप से नीचे दिखाए गए के बराबर है।

अधिक जानकारी यहाँ संलग्न करें।


-2

इसे इस्तेमाल करे:-

@property (nonatomic,retain) NSString *newTitle;

1
फिर भी, वही सटीक मुद्दा। FYI करें, त्रुटि लाइन @synthesize लाइन पर है।
नोआम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.