স্মৃতি ব্যবস্থাপনা

বেশিরভাগ জাভা ডেভেলপারদের প্রথম প্রশ্নটি হল J2ObjC দ্বারা কীভাবে মেমরি ম্যানেজমেন্ট প্রয়োগ করা হয়, যেহেতু জাভাতে আবর্জনা সংগ্রহ করা আছে এবং অবজেক্টিভ-সি ডিফল্টরূপে নয়। iOS-এর মেমরি পরিচালনার দুটি পদ্ধতি রয়েছে: রেফারেন্স গণনা এবং স্বয়ংক্রিয় রেফারেন্স কাউন্টিং (ARC)।

J2ObjC কোন পদ্ধতি বেছে নেওয়া হয়েছে তার উপর নির্ভর করে বিভিন্ন মেমরি ম্যানেজমেন্ট কোড তৈরি করে। ARC ব্যবহার করে এমন কোড তৈরি করতে -use-arc বিকল্প দিয়ে অনুবাদ করুন। ডিফল্টরূপে এটি ম্যানুয়াল রেফারেন্স গণনা ব্যবহার করে।

রেফারেন্স গণনা

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

এই প্রযুক্তির একটি সমস্যা হল কিভাবে একটি বস্তুর মালিকানা হস্তান্তর করা যায়। উদাহরণস্বরূপ, একটি বস্তু তৈরি করার জন্য একটি কারখানা পদ্ধতি বলা যেতে পারে। যদি ফ্যাক্টরি পদ্ধতি অবজেক্টটিকে ফেরত দেওয়ার আগে রিলিজ করে (যেহেতু এটি আর অবজেক্টের মালিক হতে চায় না), তাহলে কলিং পদ্ধতিটি এটি ধরে রাখতে পারে তার আগে সেই বস্তুটি মুক্ত করা হয়।

একটি বস্তুর মালিকানা হস্তান্তর করার জন্য, একটি পদ্ধতি এটিকে একটি অটোরিলিজ বার্তা পাঠায় (একটি রিলিজ বার্তার পরিবর্তে), যা রিলিজ বার্তাটিকে পিছিয়ে দেয়। এটি ফ্যাক্টরি পদ্ধতিকে একটি বস্তু তৈরি করার অনুমতি দেয় যা ফেরত দেওয়া যায়, এবং বস্তুটিকে অবৈধ না করে তার মালিকানা ত্যাগ করে। নিয়মিত বিরতিতে (যেমন একটি iOS অ্যাপ্লিকেশনে প্রতিটি ইভেন্ট লুপ পুনরাবৃত্তির পরে) অটোরিলিজ পুলটি "ড্রেনড" হয়, যার অর্থ সেই পুলের সমস্ত বস্তুকে বিলম্বিত রিলিজ বার্তা পাঠানো হয়। যে কোন বস্তুর ধরে রাখার সংখ্যা শূন্যে নেমে আসে স্বাভাবিক হিসাবে মুক্ত হয়।

কারণ মেমরি পরিচালনার বোঝা বিকাশকারীর উপর, রেফারেন্স গণনা পদ্ধতির মাধ্যমে মেমরি ফাঁস করা সহজ। যাইহোক, অ্যাপল এই সমস্যাটি কমানোর জন্য কিছু সর্বোত্তম অনুশীলনের সুপারিশ করে, যা J2ObjC প্রয়োগ করে।

মেমরি লিক সনাক্ত করতে রানটাইম এবং টুল সমর্থন আছে। অবজেক্টিভ-সি রানটাইম কোনো অ্যাপ্লিকেশান প্রস্থান করার সময় যে কোনো সনাক্ত করা লিক রিপোর্ট করে, এটি একটি কারণ যে J2ObjC JUnit পরীক্ষাগুলিকে এক্সিকিউটেবল বাইনারিতে অনুবাদ করে। এক্সকোড ক্ল্যাং ব্যবহার করে এবং সেই কম্পাইলারের মেমরি সমস্যার জন্য চমৎকার স্ট্যাটিক বিশ্লেষণ রয়েছে, যা এক্সকোড তার বিশ্লেষণ কমান্ডের সাথে উপলব্ধ করে।

স্বয়ংক্রিয় রেফারেন্স কাউন্টিং (ARC)

ARC হল Apple এর প্রস্তাবিত মেমরি ম্যানেজমেন্ট পদ্ধতি। এটি রেফারেন্স গণনার দায়িত্ব কম্পাইলারের কাছে নিয়ে যায়, যা সংকলনের সময় যথাযথ রিটেন, রিলিজ এবং অটোরিলিজ পদ্ধতি যোগ করে। ARC iOS 5 এবং তার পরের ডিভাইসের জন্য দুর্বল রেফারেন্স সমর্থন করে।

আমরা সুপারিশ করি যে প্রকল্পগুলি অনুবাদিত কোডের জন্য ARC ব্যবহার করে। ট্রান্সপিল্ড অবজেক্টিভ-সি কোডটি হস্তলিখিত অবজেক্টিভ-সি কোডের মতো। ARC ব্যবহার করা ডেভেলপারদের সাধারণ মেমরি-সম্পর্কিত ত্রুটিগুলি এড়াতে সাহায্য করতে পারে যেমন ওভার-রিলিজিং বা কম রেফারেন্সিং, মেমরি পরিচালনাকে সহজ করে এবং কম ত্রুটি-প্রবণ করে।

মনে রাখবেন ARC ডিফল্টভাবে ব্যতিক্রম-নিরাপদ নয় । বিশেষত, ব্যতিক্রমগুলি নিক্ষেপ করা হলে এটি মেমরি লিক করে। যেহেতু ব্যতিক্রমগুলি জাভাতে বেশি সাধারণ এবং সাধারণত পুনরুদ্ধারযোগ্য, এটি সমস্যাযুক্ত হতে পারে। arc-এর সাথে কম্পাইল করার সময় -fobjc-arc-exceptions ব্যবহার করলে কিছু গ্রহণযোগ্য পারফরম্যান্স খরচ সহ ফাঁস ঠিক করা হবে।

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

দুর্বল রেফারেন্স

ক্ষেত্রগুলিকে com.google.devtools.j2objc.Weak দিয়ে টীকা করা যেতে পারে, যা ট্রান্সপিলার এমন ক্ষেত্র তৈরি করতে ব্যবহার করে যা অবজেক্টিভ-সি দুর্বল রেফারেন্স শব্দার্থকে অনুসরণ করে। রেফারেন্স গণনা ব্যবহার করার সময়, এর মানে হল যে ক্ষেত্রটি আরম্ভ করার সময় ধরে রাখা হয় না, এবং এটি স্বয়ংক্রিয়ভাবে প্রকাশিত হয় যখন ধারণকৃত উদাহরণটি প্রকাশ করা হয়। ARC এর সাথে, দুর্বল ক্ষেত্রগুলিকে __unsafe_unretained টীকা দিয়ে চিহ্নিত করা হয় এবং সম্পর্কিত বৈশিষ্ট্যগুলিকে দুর্বল বলে ঘোষণা করা হয়।

কিছু ক্ষেত্রে, একটি অভ্যন্তরীণ শ্রেণীর উদাহরণ তার বাইরের উদাহরণের সাথে একটি রেফারেন্স চক্রে আসে। এখানে, একটি com.google.devtools.j2objc.WeakOuter টীকা অভ্যন্তরীণ শ্রেণী চিহ্নিত করার জন্য ব্যবহৃত হয়, তাই বাইরের শ্রেণীর উল্লেখ উপরে বর্ণিত হিসাবে বিবেচনা করা হয়। অভ্যন্তরীণ শ্রেণীর অন্যান্য ক্ষেত্রগুলি এই টীকা দ্বারা প্রভাবিত হয় না।

J2ObjC WeakReference ক্লাসকেও সমর্থন করে, তাই এটি ব্যবহার করা জাভা কোড অনুবাদ করার সময় একইভাবে কাজ করবে। সচেতন থাকুন যে WeakReference JVM-তে সহজাতভাবে ননডিটারমিনিস্টিক; যে অ্যাপ্লিকেশনগুলি পূর্বাভাস বজায় রাখার সময় মেমরি ফাঁস এড়াতে চায় তাদের পরিবর্তে @Weak এবং @WeakOuter পছন্দ করা উচিত।

মেমরি ম্যানেজমেন্ট টুলস