ত্রুটি: লিখনযোগ্য পারমাণবিক সম্পত্তি কোনও সংজ্ঞায়িত সেটার / গেটর ব্যবহারকারীর সংজ্ঞায়িত সেটার / গেটারের সাথে জুড়ি দিতে পারে না


128

আমি সম্প্রতি একটি পুরানো এক্সকোড প্রকল্প (যা কেবল সূক্ষ্ম সংকলন করত) সংকলন করার চেষ্টা করেছি এবং এখন আমি এই ফর্মটির অনেক ত্রুটি দেখতে পাচ্ছি:

error: writable atomic property 'someProperty' cannot pair a synthesized setter/getter with a user defined setter/getter

কোড প্যাটার্ন যা এই ত্রুটিগুলির কারণ হয় সর্বদা এটির মতো দেখাচ্ছে:

// Interface:

@property (retain) NSObject * someProperty;

// Implementation:

@synthesize someProperty; // to provide the getter
- (void)setSomeProperty:(NSObject *)newValue
{
    //..
}

আমি দেখতে পাচ্ছি কেন ত্রুটি উত্পন্ন হচ্ছে। আমি সংস্থাপককে আমার সম্পত্তি অ্যাক্সেসরগুলি (গেটর এবং সেটার উভয়) সংশ্লেষ করতে বলি এবং তারপরে তারপরে আমি নিজেই সেটারটিকে ওভাররাইড করি। এই কোডটি সর্বদা একটু দূরে গন্ধ পেয়েছে।

সুতরাং, এটি করার উপযুক্ত উপায় কী? আমি যদি এর @dynamicপরিবর্তে ব্যবহার করি তবে আমাকে আরও @synthesizeভালভাবে লিখতে হবে। যে একমাত্র উপায়?


এটি কি কেবল atomicসম্পত্তিগুলির সাথেই ঘটে ? পারমাণবিক বৈশিষ্ট্যগুলির ক্ষেত্রে লকিং কৌশলের ক্ষেত্রে গ্রাহক / সেটার জুটি সিঙ্কে রাখাই ভাল ধারণা হতে পারে। এটি কঠিন যদি একটি অংশ সংশ্লেষিত হয় এবং অন্য অংশটি কাস্টম কোড হয়।
নিকোলাই রুহে

আমি সম্পত্তিটি অকেটমিক করে নিলে অবশ্যই তা চলে যাবে। মজাদার. এমনকি আমি সিঙ্ক্রোনাইজেশন ইস্যু সম্পর্কে চিন্তাও করি নি।
জেমস

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

ডিফল্টরূপে প্রতিটি সম্পত্তি পরমাণু হয় এবং আমাদের সেগুলি স্পষ্টতই অজাতাত্মক করা দরকার। পারমাণবিক বৈশিষ্ট্যগুলি থ্রেড নিরাপদ, সুতরাং আমরা সেটার এবং গেটর তাদের জন্য কার্যকর করতে পারি না কারণ এটি এর থ্রেড নিরাপদ কার্যকারিতা পরিবর্তন করবে। আমি আশা করি আপনি কেন এই ত্রুটি পাচ্ছেন তার কারণ আপনি পেয়ে যাবেন।
মোহাম্মদ হায়দার

উত্তর:


218

আমার একই সমস্যা ছিল এবং কিছুটা গবেষণা করার পরে, এই সমস্যাটি সম্পর্কে আমার উপসংহারটি এখানে:

সংকলক আপনাকে এমন একটি সম্পর্কে সতর্ক করে @propertyযা আপনি পারমাণবিক হিসাবে ঘোষণা করেছিলেন (অর্থাত্ nonatomicকীওয়ার্ড বাদ দিয়ে ), তবুও আপনি কীভাবে সেই সম্পত্তির অ্যাক্সেসকে সিঙ্ক্রোনাইজ করতে হয় তার একটি অসম্পূর্ণ বাস্তবায়ন সরবরাহ করেন।

সেই সতর্কতাটি অদৃশ্য করার জন্য:

আপনি যদি কোনওটিকে @propertyপরমাণু হিসাবে ঘোষণা করেন তবে নিম্নলিখিতগুলির একটি করুন:

  • ব্যবহার @dynamicবা;
  • @synthesizeসংশ্লেষিত সেটার এবং গেটর ব্যবহার এবং রাখুন;
  • সেটার এবং প্রাপ্তকারী উভয়কে (উপরোক্ত নির্দেশাবলীর কোনও ব্যবহার না করে) ম্যানুয়াল বাস্তবায়ন সরবরাহ করুন ।

আপনি যদি এর @propertyসাথে ঘোষনা করেন (nonatomic)তবে আপনি গেটার এবং সেটটারগুলির ম্যানুয়াল এবং সংশ্লেষিত প্রয়োগগুলি মিক্স করতে পারেন।

আপডেট: সম্পত্তি অটো-সংশ্লেষ সম্পর্কিত একটি নোট

এলএলভিএম ৪.০ হিসাবে, ক্ল্যাং ঘোষিত বৈশিষ্ট্যগুলির জন্য স্ব-সংশ্লেষণ সরবরাহ করে @dynamic। ডিফল্টরূপে, এমনকি যদি আপনি এটি ছেড়ে চলে যান @synthesizeতবেও সংকলকটি আপনাকে গেটর এবং সেটার পদ্ধতি সরবরাহ করবে। যাইহোক, পারমাণবিক বৈশিষ্ট্যের জন্য নিয়ম এখনও একই হল: উভয় ক্ষেত্রেই কম্পাইলার প্রদান দিন উভয় গেটার এবং সেটার, অথবা তাদের বাস্তবায়ন উভয় নিজেকে!


ধন্যবাদ! "@ প্রপার্টিটি (ননোটমিক) দিয়ে ঘোষণা করুন"
নিয়ানলিয়াং

14

আপনাকে গেটরও বাস্তবায়ন করতে হবে। উদাহরণ:

// Interface:

@property (retain) NSObject * someProperty;

// Implementation:

- (void)setSomeProperty:(NSObject *)newValue
{
    @synchronized (self)
    {
        // ...
    }
}

- (NSObject *)someProperty
{
    NSObject *ret = nil;

    @synchronized (self)
    {
        ret = [[someProperty retain] autorelease];
    }

    return ret;
}

12

"উদ্দেশ্য সি কাস্টম সম্পত্তি" অনুসন্ধান থেকে প্রাপ্ত শীর্ষস্থানীয় অন্যান্য হিটগুলির মধ্যে এই প্রশ্নটি "সেটার =" বা "গিটার =" সম্পর্কিত তথ্যের সাথে আপডেট হয় না।

সুতরাং, এই প্রশ্নে আরও তথ্য সরবরাহ করতে:

আপনি লেখার মাধ্যমে আপনার নিজস্ব পদ্ধতিতে @ প্রপার্টি কল সরবরাহ করতে পারেন

    @property(setter = MySetterMethod:, getter = MyGetterMethod)

সরবরাহকৃত সেটার পদ্ধতির জন্য কোলনটি লক্ষ্য করুন।

অ্যাপল ডকুমেন্টেশন রেফারেন্স

সম্পাদনা: আমি ওজেক্টিভ-সি এর বৈশিষ্ট্যগুলিতে নতুন পরিবর্তনগুলি (তারা এখন অনেক বেশি বুদ্ধিমান) কীভাবে এই প্রশ্নের উত্তর পরিবর্তন করে তা আমি নিশ্চিত নই। সম্ভবত এটি সমস্ত পুরানো হিসাবে চিহ্নিত করা উচিত।


আমি দেখতে পেয়েছি যে সেটার পদ্ধতিটি সেট করা আসলে সতর্কতাটি সরিয়ে দেয় না। উদা -> "@ প্রপার্টি (নির্ধারিত, সেটটার = সেটডেলিগেট :) আইডি প্রতিনিধি;" এই উদাহরণে আমি যা করতে পারি তা হ'ল আমার নিজস্ব প্রযোজক যুক্ত করা বা ননোটমিক সম্পত্তি যুক্ত করা, যা আমার নিশ্চিত হওয়া উচিত কিনা তা নিশ্চিত করে আমি নিজেকে প্রতিনিধি নির্ধারণ করছি 'পরমাণুগতভাবে', ননোটমিক সম্পত্তি থাকার বিষয়টি বিবেচ্য নয় , বা তাই আমি বুঝতে পারি।
ডেভিড ভ্যান দুগ্তেরেন

মজার, ডেভিড। এটি অবজেক্টিভ-সি এর কোন "সংস্করণ" রয়েছে (আমি মনে করি এক্সকোড-সংস্করণটি আরও সহায়ক হবে)? আমি নিশ্চিত নই যে অবজেক্ট-সি-তে সাম্প্রতিক পরিবর্তনগুলি বিশেষত আইওএস 6 এর দ্বারা এটিকে প্রভাবিত করে।
মাটিয়াস ফোর্বর্ড

0

অপরদের জন্য যারা ওপি বর্ণিত কারণে এই ত্রুটিটি পাচ্ছেন, আপনার সম্ভবত আমার মতো সমস্যা রয়েছে:

আপনার - - () পদ্ধতি হিসাবে একই নামের একটি @ প্রপার্টি রয়েছে।

এটার মতো কিছু:

@property UIView *mainView;

-(UIView *)mainView;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.