শব্দার্থক ইস্যু: সম্পত্তির সংশ্লেষিত গেটার 'মালিকানাধীন' অবজেক্টগুলি ফেরত দেওয়ার জন্য কোকো নামকরণের কনভেনশন অনুসরণ করে


283

আমি বর্তমানে আইওএস 5 এসডিকে আমার অ্যাপটি বিকাশের চেষ্টা করছি। আমি এনএসএসস্ট্রিংকে একটি সম্পত্তি বানানোর চেষ্টা করছি এবং তারপরে এটি এম। এম ফাইলে সংশ্লেষিত করার জন্য (কোনও সমস্যা ছাড়াই আমি এটি আগে করেছি)। এখন, আমি এটি জুড়ে এসেছি: "শব্দার্থিক ইস্যু: সম্পত্তির সংশ্লেষিত গেটর 'মালিকানাধীন' অবজেক্টগুলি ফেরত দেওয়ার জন্য কোকো নামকরণের কনভেনশন অনুসরণ করে" "

এটি আমার কোড: h

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

.m

@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কলারের মালিকানাধীন কোনও জিনিস ফেরত দেয় না এমন একটি পদ্ধতি বলা আপনার কোডটি পড়ে অন্য ব্যক্তির জন্য বিভ্রান্তিকর হতে পারে।


রেকর্ডটির জন্য, অ্যাপল এআরসি রিলিজ নোটগুলিতে রূপান্তরিত প্রকাশ করেছে , যেখানে তারা জানিয়েছে:

আপনি একটি সম্পত্তি একটি নাম দিয়ে শুরু হয় দিতে পারবে না newবা copy

তাদের ইতিমধ্যে জানিয়ে দেওয়া হয়েছে যে তাদের বক্তব্যটি পুরোপুরি সঠিক নয়: দোষী সম্পত্তিটির নাম নয়, প্রাপ্তির পদ্ধতির নাম।


17 জানুয়ারী 2015 সম্পাদনা করুন: আমি স্রেফ ক্ল্যাংয়ের প্রতি সাম্প্রতিক প্রতিশ্রুতিটি লক্ষ্য করেছি যে objc_method_family(none)সাধারণ ক্ষেত্রে যেখানে কোনও সম্পত্তির নাম একটি বিশেষ পদ্ধতির পারিবারিক উপসাগুলির সাথে মেলে তার জন্য একটি ফিক্স-সহ, উপরের 3 বিকল্পটি (ব্যবহার ) করার পরামর্শ দেয় । এক্সকোড সম্ভবত শেষ পর্যন্ত এই পরিবর্তনটি অন্তর্ভুক্ত করবে।


6
মনোমুগ্ধকর মানুষের মতো কাজ করেছেন !! ধন্যবাদ !!! ভবিষ্যতের রেফারেন্সের জন্য - আমি "@ প্রপার্টি (শক্তিশালী, ননটমিক, গেটার = দ্য নিউটাইটেল) এনএসএসস্ট্রিং * নিউ টাইটেল ব্যবহার করেছি;"
নওম

8
অসাধারণ উত্তর। আমার ভেরিয়েবলগুলি "নতুন" উপসর্গযুক্ত ছিল।

আমিও এই সমস্যা পেয়েছি, এবং এটি আমার অনেক সময় নষ্ট করে! আপনি সত্যই একজন প্রতিভা ~ ধন্যবাদ!
এইচ লাই

NS_RETURNS_NOT_RETAINEDআপনারও যা দরকার তা হল।
ডনসং

55

অগ্রহণযোগ্য বস্তুর নাম

  • newButton
  • copyLabel
  • allocTitle

গ্রহণযোগ্য অবজেক্টের নাম

  • neueButton
  • mCopyLabel
  • _allocTitle

#car # অটো-সংশ্লেষিত # এক্সকোড-4.6.1

** সম্পাদনা করুন **

স্পষ্টতই আপনি মিউটটেবল কপি ব্যবহার করতে পারবেন না ।


1
আমি আরও লক্ষ্য করেছি যে "অনুলিপি" এখন পর্যন্ত ব্যবহার করা যাবে না।
রিশব

30

নতুন দিয়ে শুরু হওয়া সদস্যের নাম হ'ল সতর্কতাটি ট্রিগার করে। নামটি সম্পাদিত শিরোনামে পরিবর্তন করুন এবং সতর্কতাটি চলে যাবে। আমি এটি নিশ্চিত করে ডকুমেন্টেশন খুঁজে পাইনি তবে পরীক্ষার মাধ্যমে সেই সদস্য ভেরিয়েবলগুলি নির্ধারণ করতে সক্ষম হয়েছিল যা 'নতুন' সংকলককে আরও বাড়িয়ে দিয়ে শুরু হয়।


8

এআরসি সম্পত্তির নামে "নতুন ...." ব্যবহার করার অনুমতি দেয় না। তবে আপনি গেটের নাম পরিবর্তন করে "নতুন টাইটেল" ব্যবহার করতে পারেন।

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

6

এটি দেখে মনে হচ্ছে না যে বাভারিয়াস আপনাকে যা করতে চেয়েছিল তা হ'ল। আপনি যা করতে চান তা হ'ল একটি উদাহরণ পরিবর্তনশীল ঘোষণা করা NewTitleএবং তারপরে সম্পত্তিটি সংশ্লেষ করা। আমাদের উদাহরণটি পরিবর্তনশীল এবং সম্পত্তি ঘোষণা করতে হবে। আর না.

এখন, আমি বিশ্বাস করি যে এটি করার সঠিক উপায়টি নিম্নলিখিত:

@interface ViewController : UIViewController

@property (nonatomic, strong) NSString *newTitle;

.m

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

সম্পত্তি জন্য উদাহরণ পরিবর্তনশীল newTitleসংশ্লেষিত হয়। আপনি চান না যে আপনার উদাহরণটি ভেরিয়েবল আপনার সম্পত্তির সমান হোক - ভুল করা খুব সহজ

উদাহরণ দেখুন : বৈশিষ্ট্য ঘোষণা এবং অ্যাক্সেসরগুলি সংশ্লেষকরণ


এটি সংকলক সংস্করণ উপর নির্ভর করে। ঝাঁকুনির সাম্প্রতিক সংস্করণগুলি এই ক্ষেত্রে একটি সতর্কতা প্রকাশ করে, যে কারণে আমি আমার উত্তরে সংকলক সংস্করণ উল্লেখ করেছি।

আমি মনে করি না আপনি সমস্যার সমাধান করেছেন। এক্সকোড 9 এর জন্য, এটি একটি ত্রুটি, সতর্কবার্তা নয়। NS_RETURNS_NOT_RETAINEDআপনার যা প্রয়োজন তা হল
ডনসং

4

কোরডাটাতে আপনি যদি "নতুন ..." অ্যাট্রিবিউটে ব্যবহার করেন (সাধারণত সংকলন করুন) এটি একটি "খারাপ অ্যাক্সেস" ব্যতিক্রমের সাথে এলোমেলোভাবে ক্রাশ হবে।

কোনও ক্র্যাশ লগ নেই এবং "সমস্ত ব্যতিক্রম ব্রেকপয়েন্ট" এর সাথে দেখানো লাইন আপনাকে মোটেই সহায়তা করবে না।


3

সম্পত্তির এই সতর্কতাটি মুছে ফেলার মতো ম্যানুয়ালি একটি সেটার লিখতে হবে।


এক্সকোড 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_retained' বৈশিষ্ট্যটি 'ns_returns_retained' এর পরিপূরক। যেখানে কোনও ফাংশন বা পদ্ধতি কোকো কনভেনশন মেনে চলতে পারে এবং ধরে রাখা কোকো অবজেক্টকে ফিরিয়ে আনতে পারে, এই বৈশিষ্ট্যটি ব্যবহার করে ইঙ্গিত দেওয়া যেতে পারে যে প্রত্যাবর্তিত বস্তুর রেফারেন্স কলারের কাছে ফিরে আসা "মালিকানা" রেফারেন্স হিসাবে বিবেচনা করা উচিত নয়। ফাউন্ডেশন ফ্রেমওয়ার্কটি একটি ম্যাক্রো এনএসআরসিটার_সনোএনআরটিইএনইডি সংজ্ঞায়িত করে যা নীচের চিত্রের সাথে কার্যত সমতুল্য।

আরও বিশদ এখানে সংযুক্ত করুন।


-2

এটা চেষ্টা কর:-

@property (nonatomic,retain) NSString *newTitle;

1
এখনও, একই সঠিক সমস্যা। এফওয়াইআই, ত্রুটি লাইনটি @ সংশ্লেষিত লাইনে রয়েছে।
নওম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.