কাস্টম dealloc এবং এআরসি (উদ্দেশ্য-সি)


208

আমার ছোট আইপ্যাড অ্যাপ্লিকেশনটিতে আমার কাছে একটি "স্যুইচ ভাষা" ফাংশন রয়েছে যা পর্যবেক্ষক ব্যবহার করে uses প্রতিটি দেখার নিয়ামক এর সময়কালে আমার পর্যবেক্ষকের সাথে নিজেকে নিবন্ধিত করে viewDidLoad:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [observer registerObject:self];
}

যখন ব্যবহারকারী "ভাষা পরিবর্তন করুন" বোতামটি হিট করে, তখন নতুন ভাষাটি আমার মডেলটিতে সংরক্ষণ করা হয় এবং পর্যবেক্ষককে অবহিত করা হয় এবং updateUi:তার নিবন্ধিত বস্তুগুলিতে একজন নির্বাচককে কল করে।

এটি আমার খুব ভালভাবে কাজ করে, যখন আমার কোনও ট্যাববারকন্ট্রোলারে নিয়ন্ত্রক থাকে except এটি কারণ যখন ট্যাব বারটি লোড হয়, তখন এটি চাইল্ড কন্ট্রোলারদের কাছ থেকে ভিউগুলি আরম্ভ না করেই ট্যাব আইকনগুলি নিয়ে আসে, তাই viewDidLoad:বলা হয় না, সুতরাং সেই দৃশ্য নিয়ন্ত্রণকারীরা ভাষা পরিবর্তনের বিজ্ঞপ্তিগুলি গ্রহণ করে না। এই কারণে, আমি আমার registerObject:কলগুলি initপদ্ধতিতে সরিয়ে নিয়েছি ।

ফিরে যখন আমি viewDidLoad:আমার পর্যবেক্ষকের সাথে নিবন্ধন করতাম, আমি viewDidUnload:নিবন্ধন করতাম । যেহেতু আমি এখন নিবন্ধভুক্ত করছি init, তাই এটি নিবন্ধভুক্ত করা অনেক অর্থবোধ করে dealloc

তবে এখানে আমার সমস্যা। আমি যখন লিখি:

- (void) dealloc
{
    [observer unregisterObject:self];
    [super dealloc];
}

আমি এই ত্রুটি পেয়েছি:

এআরসি 'ডেলোক'-এর স্পষ্ট বার্তা প্রেরণ নিষিদ্ধ করেছে

যেহেতু [super dealloc]সুপারক্লসগুলি সঠিকভাবে পরিষ্কার হওয়া নিশ্চিত করার জন্য আমাকে কল করা দরকার তবে এআরসি এটি নিষিদ্ধ করে, এখন আমি আটকে আছি। আমার অবজেক্টটি যখন মারা যাচ্ছে তখন অবহিত হওয়ার আর কি উপায় আছে?


পার্শ্ব নোট হিসাবে - এরকম পরিস্থিতি স্মৃতি ফাঁসির কারণ হতে পারে যা লিক্স সরঞ্জামটিতে প্রদর্শিত হবে না। যদি ডেটা মডেল পর্যবেক্ষকের রেফারেন্স ধরে রাখে (যা এআরসি-র অধীনে ডিফল্ট জিনিস এমনকি আইভারদের জন্যও) তবে ডেলালোক কখনই ডাকা হবে না, যেমন ধরে রাখা গণনা শূন্যের চেয়ে বড় হবে। সুতরাং, ডেললকটিকে প্রথম স্থানে ডেকে আনা সক্ষম করার জন্য আপনাকে পর্যবেক্ষকটিকে ম্যানুয়ালি নিবন্ধভুক্ত করতে হতে পারে।
Błażej Czapp

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

@ ব্লেজেজক্যাজপ যেহেতু তিনি ইউআইটিববারকন্ট্রোলার ব্যবহার করছেন, এবং আসুন আমরা ইউআইটিববারকন্ট্রোলার সর্বদা নিবন্ধিত নিয়ন্ত্রকের একটি রেফারেন্স রাখব (যেহেতু আমি অনুমান করি যে এটির 'শিশু' নিয়ন্ত্রকদের ক্ষেত্রে যেমন আছে), মেমরি ফাঁস হওয়া কি এখনও কোনও সমস্যা হয়ে উঠবে? আমি দেখতে পাচ্ছি না কখন নিবন্ধিত নিয়ামক বরাদ্দ হবে। ধন্যবাদ
ওবজেক্টিফ

উত্তর:


419

এআরসি ব্যবহার করার সময়, আপনি কেবল [super dealloc]স্পষ্টভাবে কল করবেন না - সংকলকটি এটি আপনার জন্য পরিচালনা করে ( ক্ল্যাং এলএলভিএম এআরসি ডকুমেন্টে chapter.১.২ অধ্যায়ে বর্ণিত ):

- (void) dealloc
{
    [observer unregisterObject:self];
    // [super dealloc]; //(provided by the compiler)
}

4
যদি ভিউ পর্যবেক্ষকের কাছে একটি রেফারেন্স ধারণ করে এবং পর্যবেক্ষক দর্শনটির জন্য রেফারেন্স ধরে থাকে তবে আমাদের কাছে একটি বিজ্ঞপ্তিযুক্ত রেফারেন্স রয়েছে। সুতরাং দেখার রেফারেন্স গণনা 0 এর চেয়ে বেশি, এবং deallocকখনও কল করা হয় না। [observer unregisterObject:self]Dealloc এ কল করা কি বোধগম্য? আমি কী মিস করছি?
ব্যবহারকারী 443854

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