এও মনে রাখবেন যে আপনার ব্লক যদি অন্য কোনও অবজেক্টকে ধরে রাখে যা ধরে রাখে তখন ধরে রাখা চক্রগুলি ঘটতে পারে self
।
আমি নিশ্চিত নই যে আবর্জনা সংগ্রহ এই বজায় রাখা চক্রগুলিতে সহায়তা করতে পারে। যদি অবজেক্টটি ব্লক ধরে রাখে (যা আমি সার্ভারের বস্তুকে কল করব) আউটলাইভ self
(ক্লায়েন্ট অবজেক্ট), রেফারেন্সself
অবরুদ্ধ অবজেক্টটি প্রকাশ না করা অবধি ব্লকের অভ্যন্তরের চক্র হিসাবে বিবেচিত হবে না। যদি সার্ভারের অবজেক্টটি তার ক্লায়েন্টদের বহিরাগত করে তোলে, আপনার কাছে একটি উল্লেখযোগ্য মেমরি ফুটো হতে পারে।
যেহেতু কোনও পরিষ্কার সমাধান নেই, তাই আমি নীচের কাজের ক্ষেত্রগুলি সুপারিশ করব। আপনার সমস্যা সমাধানের জন্য তাদের মধ্যে এক বা একাধিকটি নির্দ্বিধায় বেছে নিন।
- কেবলমাত্র সমাপ্তির জন্য ব্লকগুলি ব্যবহার করুন , এবং উন্মুক্ত ইভেন্টগুলির জন্য নয়। উদাহরণস্বরূপ, মতো পদ্ধতিগুলির জন্য
doSomethingAndWhenDoneExecuteThisBlock:
এবং না পদ্ধতিগুলির জন্য ব্লকগুলি ব্যবহার করুন setNotificationHandlerBlock:
। সমাপ্তির জন্য ব্যবহৃত ব্লকগুলির জীবনের নির্দিষ্ট প্রান্ত থাকে এবং তাদের মূল্যায়ন করার পরে সার্ভার অবজেক্ট দ্বারা প্রকাশ করা উচিত। এটি ধরে রাখার চক্রটি দীর্ঘদিন ধরে বাঁচতে বাধা দেয় এমনকি যদি তা ঘটে থাকে।
- আপনার বর্ণিত দুর্বল-রেফারেন্স নাচটি করুন।
- আপনার অবজেক্টটি প্রকাশের আগে এটি পরিষ্কার করার জন্য একটি পদ্ধতি সরবরাহ করুন, যা সার্ভারের অবজেক্টগুলি থেকে রেফারেন্সগুলিকে ধারণ করে এটি "সংযোগ বিচ্ছিন্ন" করে; এবং অবজেক্টে রিলিজ কল করার আগে এই পদ্ধতিটি কল করুন। যদিও এই পদ্ধতিটি পুরোপুরি ঠিক আছে যদি আপনার অবজেক্টের কেবল একটি ক্লায়েন্ট থাকে (বা কোনও প্রসঙ্গে সিঙ্গলটন) তবে এটির একাধিক ক্লায়েন্ট থাকলে তা ভেঙে যাবে। আপনি মূলত এখানে ধরে রাখার গণনা প্রক্রিয়াটিকে পরাজিত করছেন; এটি
dealloc
পরিবর্তে কল করার অনুরূপ release
।
আপনি যদি কোনও সার্ভার অবজেক্ট লিখতে থাকেন তবে কেবলমাত্র সম্পূর্ণ করার জন্য ব্লক আর্গুমেন্টগুলি নিন। কলব্যাকগুলির জন্য ব্লক আর্গুমেন্টগুলি গ্রহণ করবেন না setEventHandlerBlock:
। পরিবর্তে, ক্লাসিক প্রতিনিধি প্যাটার্নে ফিরে যান: একটি আনুষ্ঠানিক প্রোটোকল তৈরি করুন এবং কোনও setEventDelegate:
পদ্ধতির বিজ্ঞাপন দিন । প্রতিনিধি ধরে রাখবেন না। এমনকি আপনি যদি কোনও আনুষ্ঠানিক প্রোটোকল তৈরি করতে না চান তবে কোনও নির্বাচককে একটি প্রতিনিধি কলব্যাক হিসাবে গ্রহণ করুন।
এবং শেষ অবধি, এই প্যাটার্নটির অ্যালার্ম বাজানো উচিত:
- (বাতিল) dealloc
[মাই সার্ভার অবজেক্ট রিলিজক্যালব্যাক ব্লকসফোরজবজেক্ট: স্ব];
...
}
যদি আপনি self
ভিতর থেকে উল্লিখিত ব্লকগুলি আনচুক করার চেষ্টা করছেন dealloc
, আপনি ইতিমধ্যে সমস্যার মধ্যে রয়েছেন। dealloc
ব্লকের রেফারেন্সের কারণে ধরে রাখা চক্রের কারণে কখনও ডাকা যাবে না, যার অর্থ সার্ভার অবজেক্টটি বিলোপ না হওয়া অবধি আপনার অবজেক্টটি কেবল ফাঁস হয়ে যাচ্ছে।
self
প্রক্সিগুলিকেthis
কেবল চারপাশের জিনিসগুলি ফ্লিপ করতে কল করতে চাই । জাভাস্ক্রিপ্টে আমি আমারthis
ক্লোজারগুলিকে কল করিself
তাই এটি সুন্দর এবং ভারসাম্য বোধ করে। :)