কোন পরিস্থিতিতে আমাদের এআরসি এর অধীনে __আউটোরেলিজিং মালিকানা যোগ্যতা লিখতে হবে?


118

আমি ধাঁধাটি সম্পূর্ণ করার চেষ্টা করছি।

__strongএনএসবজেক্ট, এনএসএসস্ট্রিং ইত্যাদির মতো সমস্ত অবজেক্টিভ-সি রক্ষণযোগ্য অবজেক্ট পয়েন্টারগুলির জন্য এটি ডিফল্ট It's এটি একটি শক্তিশালী রেফারেন্স। এআরসি -releaseসুযোগের শেষে এটির সাথে ভারসাম্য রক্ষা করে ।

__unsafe_unretainedপুরানো পথ সমান। এটি ধরে রাখার যোগ্য অবজেক্টটি ধরে না রেখে দুর্বল পয়েন্টারের জন্য ব্যবহার করা হয়।

__weakএটি __unsafe_unretainedবাদে এটি একটি স্ব-শূণ্য দুর্বল রেফারেন্সের অর্থ এই যে রেফারেন্সযুক্ত বস্তুটি বিলম্বিত হওয়ার সাথে সাথে পয়েন্টারটি নিল হয়ে যাবে। এটি ঝুঁকিপূর্ণ পয়েন্টার এবং EXC_BAD_ACCESS ত্রুটির ঝুঁকি দূর করে।

তবে ঠিক কী জন্য __autoreleasingভাল? আমার এই যোগ্যতাটি কখন ব্যবহার করতে হবে সে সম্পর্কে ব্যবহারিক উদাহরণগুলি খুঁজে পেতে আমার খুব কষ্ট হচ্ছে। আমি বিশ্বাস করি এটি কেবলমাত্র ফাংশন এবং পদ্ধতিগুলির জন্য যা একটি পয়েন্টার-পয়েন্টার যেমন:

- (BOOL)save:(NSError**);

অথবা

NSError *error = nil;
[database save:&error];

যা এআরসি এর অধীনে এইভাবে ঘোষণা করতে হবে:

- (BOOL)save:(NSError* __autoreleasing *);

তবে এটি খুব অস্পষ্ট এবং আমি কেন তা পুরোপুরি বুঝতে চাই । আমি যে কোড স্নিপেটগুলি পেয়েছি তা দুটি তারার মাঝে __আউটোরেলিজিং অন্তর্ভুক্ত রাখে, যা আমার কাছে অদ্ভুত দেখাচ্ছে। প্রকারটি NSError**(এনএসইররারের পয়েন্টার-পয়েন্টার), তাই __autoreleasingতারার মধ্যে কেন কেবল সামনে নয় কেন NSError**?

এছাড়াও, এমন অন্যান্য পরিস্থিতিও থাকতে পারে যার মধ্যে আমাকে নির্ভর করতে হবে __autoreleasing


1
আমার এই একই প্রশ্ন রয়েছে এবং নীচের উত্তরগুলি পুরোপুরি বিশ্বাসযোগ্য নয় ... উদাহরণস্বরূপ, এনএসইরার ** যুক্তিগুলিকে আপনার মতো __autoreleasing সাজসজ্জা এবং আর্ক রিলিজ নোটগুলিতে রূপান্তরকরণের সাথে ঘোষিত ব্যবস্থা কেন সরবরাহ করা হচ্ছে না? হতে হবে? উদাহরণস্বরূপ, NSFileManager.h এই রুটিনগুলির মধ্যে যে কোনও একটি ??
বাবা

উত্তর:


67

তুমি ঠিক বলছো. সরকারী ডকুমেন্টেশন যেমন ব্যাখ্যা করে:

রেফারেন্স (আইডি *) দ্বারা পাস করা হয়েছে এবং প্রত্যাবর্তনে স্বতঃআগ্রহযুক্ত আর্গুমেন্ট বোঝাতে __আউটোরলিজিং।

এআরসি ট্রানজিশন গাইডে এগুলি সমস্ত খুব ভালভাবে ব্যাখ্যা করা হয়েছে ।

আপনার এনএসইরর উদাহরণে, ঘোষণার অর্থ __strongপুরোপুরি:

NSError * e = nil;

রূপান্তরিত হবে:

NSError * __strong error = nil;

আপনি যখন আপনার saveপদ্ধতিটি কল করবেন :

- ( BOOL )save: ( NSError * __autoreleasing * );

কম্পাইলার তারপর একটি অস্থায়ী পরিবর্তনশীল, এ সেট তৈরি করতে হবে __autoreleasing। তাই:

NSError * error = nil;
[ database save: &error ];

রূপান্তরিত হবে:

NSError * __strong error = nil;
NSError * __autoreleasing tmpError = error;
[ database save: &tmpError ];
error = tmpError;

আপনি ত্রুটি বস্তুটিকে __autoreleasingসরাসরি হিসাবে ঘোষণা করে এড়াতে পারেন ।


3
না, __autoreleasingকেবলমাত্র রেফারেন্স দিয়ে পাস করা যুক্তিগুলির জন্য ব্যবহৃত হয়। এটি একটি বিশেষ ক্ষেত্রে, কারণ আপনি কোনও সামগ্রীর পয়েন্টারটিতে একটি পয়েন্টার পেয়েছেন। সুবিধার্থী কনস্ট্রাক্টরের মতো স্টাফের ক্ষেত্রে এটি নয়, কারণ তারা কেবল কোনও বস্তুর কাছে পয়েন্টার দেয় এবং এআরসি এটি স্বয়ংক্রিয়ভাবে পরিচালনা করে।
ম্যাকমেড

7
__Autoreleasing বাছাইপর্ব কেন কেবল তারকাদের মাঝে অন্তর্নিহিত করা হয়, এবং কেবল এনএসইরর ** এর সামনে নয়? টাইপটি এনএসইরর ** হওয়ায় এটি আমার কাছে অদ্ভুত লাগে। বা এটি কারণ এটি ইঙ্গিত করার চেষ্টা করছে যে এনএসইআরআর * পয়েন্টারটিকে একটি স্বতঃস্ফূর্ত অবজেক্টের জন্য পয়েন্টিং হিসাবে যোগ্য হতে হবে?
গর্বিত সদস্য

1
আপনার প্রথম মন্তব্যে @ গর্বিত সদস্য - এটি ভুল (যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি) - নীচে গ্লেন লো এর উত্তর দেখুন। ত্রুটি অবজেক্টটি সেভ ফাংশনের অভ্যন্তরে একটি অটোরিলেজিং ভেরিয়েবল (যার মধ্যে আপনি পাস করেছেন) এটিকে তৈরি করা হয় এবং বরাদ্দ করা হয়। এই অ্যাসাইনমেন্টের ফলে সেই সময়টি অবজেক্টটি ধরে রাখা এবং স্বতঃপ্রণোদিত হয়ে যায়। সেভ ফাংশনটির ঘোষণা আমাদের এটিকে একটি অটোরিলেজিং ভেরিয়েবল ব্যতীত অন্য কিছু প্রেরণে বাধা দেয় কারণ এর জন্য এটির প্রয়োজন needs এজন্য আমরা চেষ্টা করলে সংকলক একটি অস্থায়ী পরিবর্তনশীল তৈরি করে।
কলিন

2
তাহলে কেন অ্যাপল ইন্টারফেসের কোনওটিই এটি বলে মনে হচ্ছে না? উদাহরণস্বরূপ, NSFileManager.h এর সবকিছু?
বাবা

1
@Macmade: শুধু সুযোগ দ্বারা আমি লক্ষ্য করেছি যে আপনার উত্তর সম্পাদনা করা হয়েছে (দ্বারা stackoverflow.com/users/12652/comptrol ) এবং আমি এইরকম যে আপনার প্রথম উদাহরণ পরিবর্তন অন্তত ( "পরোক্ষভাবে ... রুপান্তরিত হবে আছে ...), ভুল কারণ __strong কোয়ালিফায়ার প্রথম লাইন দ্বিতীয় লাইন থেকে সরানো হয়েছে সম্ভবত আপনি যে পরীক্ষা
মার্টিন আর

34

মন্তব্যে ম্যাকমেডের উত্তর এবং গর্বিত সদস্যের অনুসরণ সম্পর্কে প্রশ্ন অনুসরণ করা, (এটি একটি মন্তব্য হিসাবে পোস্টও করত তবে এটি সর্বাধিক চরিত্রের সংখ্যা ছাড়িয়ে গেছে):

এখানেই __autoreleasing এর ভেরিয়েবল যোগ্যতা দুটি তারকার মধ্যে রাখা হয়েছে between

উপস্থাপনের জন্য, একটি বাছাইকারী দিয়ে কোনও অবজেক্ট পয়েন্টার ঘোষণার জন্য সঠিক বাক্য গঠন:

NSError * __qualifier someError;

সংকলক এটি ক্ষমা করবে:

__qualifier NSError *someError;

তবে এটি সঠিক নয়। দেখুন অ্যাপল এআরসি রূপান্তরটি নির্দেশিকা (অধ্যায় যে শুরু পড়া "আপনি ভেরিয়েবল সঠিকভাবে সাজাইয়া রাখা উচিত ...")।

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

SomeClass * __qualifier *someVariable;

সুতরাং কোনও পদ্ধতি আর্গুমেন্টের ক্ষেত্রে যা ডাবল এনএসইরর পয়েন্টার, ডেটা টাইপ হিসাবে ঘোষণা করা হয়:

- (BOOL)save:(NSError* __autoreleasing *)errorPointer;

যা ইংরেজিতে বলেছে "এনএএসরর অবজেক্ট পয়েন্টারকে একটি __autoreleasing" poin


15

নির্ধারক এআরসি স্পেসিফিকেশন বলছেন যে

__Autoreleasing অবজেক্টের জন্য, নতুন পয়েন্টারটি ধরে রাখা হয়, স্বাবলম্বিত হয় এবং আদিম শব্দার্থক শব্দ ব্যবহার করে লভ্যালুতে সংরক্ষণ করা হয়।

উদাহরণস্বরূপ, কোড

NSError* __autoreleasing error = someError;

আসলে রূপান্তরিত হয়

NSError* error = [[someError retain] autorelease];

... এই কারণেই এটি যখন আপনার একটি পরামিতি থাকে তখন কাজ করে NSError* __autoreleasing * errorPointer, তথাপি পদ্ধতিটি ত্রুটিটি তখন নির্ধারিত করবে*errorPointer এবং উপরের শব্দার্থবিজ্ঞানগুলি এতে প্রবেশ করবে।

আপনি __autoreleasingআরআরকি অবজেক্টটিকে অটোরিলেজ পুলে জোর করার জন্য ভিন্ন প্রসঙ্গে ব্যবহার করতে পারেন তবে এটি মারাত্মকভাবে কার্যকর নয় যেহেতু এআরসি কেবল পদ্ধতি রিটার্নে অটোরিলেজ পুলটি ব্যবহার করে এবং ইতিমধ্যে স্বয়ংক্রিয়ভাবে পরিচালনা করে।

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