iphone - কোকো এবং উদ্দেশ্য সি সঙ্গে রেফারেন্স গণনা বোঝা



objective-c cocoa (10)

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

কিভাবে release , retain এবং autorelease কাজ এবং তাদের ব্যবহার সম্পর্কে সম্মেলন কি?

(অথবা যে ব্যর্থ, আপনি কি পড়েন যা আপনি এটি পেতে সাহায্য করেছে?)

https://ffff65535.com


ম্যাট ডিলার্ড লিখেছেন :

ফিরে [[গুলি অটোরলিজ] মুক্তি];

Autorelease বস্তু বজায় রাখা না। Autorelease কেবল পরে ছেড়ে দেওয়া সারিতে রাখে। আপনি সেখানে একটি রিলিজ বিবৃতি চাই না।



আগের মত, যখন লোকেরা রেফারেন্স উপাদান পুনরায় শব্দ করার চেষ্টা শুরু করে তখন তারা প্রায়শই কিছু ভুল করে বা অসম্পূর্ণ বিবরণ সরবরাহ করে।

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


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

জিসি ব্যবহার না করে মেমরি ম্যানেজমেন্ট নিয়ম হিসাবে:

  • যদি আপনি +alloc/+allocWithZone: ব্যবহার করে একটি নতুন অবজেক্ট তৈরি করেন +alloc/+allocWithZone: +new , -copy বা -mutableCopy অথবা যদি আপনি কোনও বস্তুটি ধরে -retain তবে আপনি -retain মালিকানা নিচ্ছেন এবং এটি অবশ্যই পাঠানো হয়েছে তা নিশ্চিত করতে হবে।
  • যদি আপনি অন্য কোন উপায়ে কোনও বস্তু পান তবে আপনি এটির মালিক নন এবং এটি নিশ্চিত করা উচিত নয়-দয়া করে
  • যদি আপনি নিশ্চিত হন যে কোনও বস্তু পাঠানো হয়েছে -release আপনি এটি নিজে পাঠাতে পারেন, অথবা আপনি অবজেক্টটি পাঠাতে পারেন -release -autorelease এবং বর্তমান অটোরলিজ পুল এটি পাঠানো হবে (একবার প্রাপ্ত- -autorelease ) যখন পুলটি নিষ্কাশন করা হয়।

সাধারণত -autorelease ব্যবহার করা হয় যাতে বস্তুগুলি বর্তমান ইভেন্টের দৈর্ঘ্যের জন্য বাঁচতে পারে, তবে পরবর্তীতে সেগুলি পরিষ্কার করা হয়, কারণ কোকোয়ের ইভেন্ট প্রক্রিয়াকরণের চারপাশে একটি অটোরলিজ পুল রয়েছে। কোকোতে, এমন কোনও কলকারীর কাছে বস্তুগুলি ফেরত দেওয়া অনেক বেশি সাধারণ, যা অটোরিকৃত হয় তার চেয়ে কলকাতার নিজেকে মুক্ত করার প্রয়োজন হয়।


ইতিমধ্যে যেমন উল্লেখ করা হয়েছে, অ্যাপল এর developer.apple.com/mac/library/documentation/Cocoa/Conceptual/… জন্য এখন পর্যন্ত সেরা জায়গা।

একটি দরকারী লিংক আমি এখনও উল্লিখিত দেখা যায় না developer.apple.com/mac/library/documentation/Cocoa/Conceptual/… । অ্যাপল এর ডক্সের মাঝখানে আপনি যদি এটির মাধ্যমে পড়েন তবে এটি সরাসরি লিঙ্কিংয়ের মূল্য। এটি উদাহরণস্বরূপ এবং সাধারণ ভুলগুলির সাথে মেমরি পরিচালনার নিয়মগুলির একটি উজ্জ্বল নির্বাহী সারাংশ (মূলত এখানে অন্যান্য উত্তরগুলি ব্যাখ্যা করার চেষ্টা করছে, তবে তাও নয়)।


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

যখন একটি বস্তুর রেফারেন্স গণনা 0 হয়, বস্তুটি মুক্ত হয়। এই মৌলিক রেফারেন্স গণনা করা হয়।

কিছু ভাষার জন্য, রেফারেন্স স্বয়ংক্রিয়ভাবে বৃদ্ধি এবং কমে যায়, কিন্তু উদ্দেশ্য-সি সেই ভাষাগুলির মধ্যে একটি নয়। সুতরাং প্রোগ্রামার retaining এবং মুক্তি জন্য দায়ী।

একটি পদ্ধতি লিখতে একটি সাধারণ উপায় হল:

id myVar = [someObject someMessage];
.... do something ....;
[myVar release];
return someValue;

কোডের ভেতর যেকোনো অর্জিত সংস্থানগুলি মুক্ত করার কথা মনে রাখার সমস্যাটি ক্লান্তিকর এবং ত্রুটিযুক্ত উভয়ই। উদ্দেশ্য-সিটি আরও সহজ করে তুলতে আরেকটি ধারণা উপস্থাপন করে: Autorelease Pools। Autorelease পুল প্রতিটি থ্রেড ইনস্টল করা হয় যে বিশেষ বস্তু। আপনি যদি NSAutoreleasePool দেখেন তবে এটি একটি মোটামুটি সহজ শ্রেণী।

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

উপরের কোডটি গ্রহণ করে, আপনি এটির দ্বারা ছোট এবং সহজে পড়ার জন্য এটি পুনরায় লিখতে পারেন:

id myVar = [[someObject someMessage] autorelease];
... do something ...;
return someValue;

কারণ অটোরিকশিত বস্তুটি হ'ল, আমাদের স্পষ্টভাবে এটিতে "মুক্তির" কল করার প্রয়োজন নেই। কারণ আমরা জানি যে কিছু অটোরলিজ পুল পরে আমাদের জন্য এটি করবে।

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




যদি আপনি বজায় রাখতে / মুক্ত করার প্রক্রিয়াটি বুঝতে পারেন তবে দুটি সোনালী নিয়ম রয়েছে যা "কোহা" কোকো প্রোগ্রামারদের প্রতিষ্ঠা করতে স্পষ্ট, কিন্তু দুর্ভাগ্যবশত খুব কমই নতুনদের জন্য এটি স্পষ্টভাবে বানানো হয়েছে।

  1. যদি কোনও বস্তুটি কোনও বস্তুটি ফেরত দেয় তবে তার নাম create বা copy করে বস্তুটি আপনার। আপনি যখন এটি সমাপ্ত করেন তখন [object release] কল করুন। অথবা CFRelease(object) , যদি এটি একটি কোর-ফাউন্ডেশনের বস্তু।

  2. যদি তার নামের মধ্যে এই শব্দগুলির মধ্যে একটি না থাকে তবে বস্তুটি অন্য কারো সাথে সম্পর্কিত। যদি আপনি আপনার ফাংশনের শেষে বস্তুটি রাখতে চান তবে আপনাকে অবশ্যই [object retain] কল করতে হবে।

আপনি নিজেকে তৈরি করুন ফাংশন এই কনভেনশন অনুসরণ করতে ভাল পরিবেশিত হবে।

(Nitpickers: হ্যাঁ, দুর্ভাগ্যবশত কিছু API টি কল যা এই নিয়মগুলির ব্যতিক্রম কিন্তু তারা বিরল)।


যিহোশূয় (# 6591) - ম্যাক ওএস এক্স 10.5 এ গারবেজ সংগ্রহের উপাদানটি বেশ শান্ত মনে হচ্ছে তবে আইফোনটির জন্য উপলব্ধ নয় (অথবা আপনি যদি আপনার অ্যাপ্লিকেশনটি ম্যাক ওএস এক্স এর প্রাক-10.5 সংস্করণগুলিতে চালাতে চান)।

এছাড়াও, যদি আপনি কোন লাইব্রেরি বা পুনঃব্যবহারযোগ্য কিছু লিখছেন তবে জিসি মোড ব্যবহার করে যে কেউ জি.সি. মোড ব্যবহার করেও কোডটি ব্যবহার করে লোকেদের লক করে, তাই আমি এটা বুঝতে পেরেছি, যে কেউ ব্যাপকভাবে পুনঃব্যবহারযোগ্য কোড লেখার চেষ্টা করে ম্যানুয়ালি ম্যানুয়ালি।





memory