-রেটকাউন্ট কখন ব্যবহার করবেন?


110

আপনি -retainCountএখন পর্যন্ত কোন পরিস্থিতিতে ব্যবহার করেছেন এবং অবশেষে এটি ব্যবহার করে যে সমস্যা হতে পারে তা জানতে চাই।

ধন্যবাদ।


5
আপনার কখনই ব্যবহারকারীর ব্যবহার করা উচিত নয়-retainCount
হোলএক্স

3
(-Setup যখন আপনি উচিত এটা। খুব মাঝে মাঝে সাহায্যের জন্য উপযোগী বুঝতে কি হচ্ছে, তাই যতদিন আপনি প্রশংসা এটি গম্ভীরভাবে সময়ে বিভ্রান্তিকর হতে পারে এবং, অবশ্যই, এটা এআরসি ব্যবহার করা হয় তবে এ সব অনুমতি নেই।।)
গরম licks

উত্তর:


243

আপনার কখনই ব্যবহার করা উচিত নয় -retainCount, কারণ এটি আপনাকে দরকারী কিছু বলে না। ফাউন্ডেশন এবং অ্যাপকিট / ইউআইকিট ফ্রেমওয়ার্কগুলির বাস্তবায়ন অস্বচ্ছ; আপনি কী জানেন যে কী ধরে রাখা হচ্ছে, কেন এটি ধরে রাখা হচ্ছে, কে এটি ধরে রাখছে, কখন ধরে রাখা হয়েছিল ইত্যাদি and

উদাহরণ স্বরূপ:

  • আপনি ভাবতে পারেন যে [NSNumber numberWithInt:1]একটি হবে retainCount1. আইটি না। এটা 2।
  • আপনি ভাবতে পারেন যে @"Foo"একটি হবে retainCount1. আইটি না। এটি 1152921504606846975।
  • আপনি ভাবতে পারেন যে [NSString stringWithString:@"Foo"]একটি হবে retainCount1. আইটি না। আবার এটি 1152921504606846975।

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

আপনি যদি কোনও বিষয় কেন অবৈধ হয়ে যাচ্ছেন না তা ট্র্যাক করার চেষ্টা করছেন, তবে ইনস্ট্রুমেন্টসে লিকস সরঞ্জামটি ব্যবহার করুন। যদি আপনি খুব শীঘ্রই কোনও জিনিস কেন নির্বিঘ্ন করা হয়েছে তা সন্ধান করার চেষ্টা করছেন, তবে ইনস্ট্রুমেন্টসগুলিতে জম্বি সরঞ্জামটি ব্যবহার করুন।

কিন্তু ব্যবহার করবেন না -retainCount। এটি একটি সত্যই মূল্যহীন পদ্ধতি।

সম্পাদন করা

দয়া করে প্রত্যেকে http://bugreport.apple.com এ যান এবং হতাশার অনুরোধ করুন -retainCount। যত বেশি লোকেরা এর জন্য জিজ্ঞাসা করবে তত ভাল।

সম্পাদনা # 2

আপডেট হিসাবে, [NSNumber numberWithInt:1]এখন retainCount9223372036854775807 আছে your আপনার কোডটি এটি 2 হওয়ার প্রত্যাশা করে থাকলে আপনার কোডটি এখন ভেঙে গেছে।


4
আপনার উদাহরণের জন্য @ ডেভ-দেলং ধন্যবাদ।
মোসজি

1
retainCount বর্তমানে singletons জন্য দরকারী। (এখন প্রশ্ন কিভাবে দরকারী singletons হয় ... হয়) - (NSUInteger)retainCount{return NSUIntegerMax;}
জো

8
@ জো আপনি ওভাররাইড না করেই সিঙ্গলটন বানাতে পারেন retainCount
ডেভ ডিলং

5
@ জো আমি এটি সম্পর্কে অবগত; গুগল "উদ্দেশ্য-সি সিঙ্গলটন" সমস্ত উদাহরণের জন্য কেন সেই উদাহরণটি খুব ভাল নয় on
ডেভ দেলং

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

50

না!

সিরিয়াসলি। শুধু এটা করবেন না।

কেবল মেমরি ম্যানেজমেন্ট গাইডলাইনগুলি অনুসরণ করুন এবং কেবলমাত্র আপনাকে alloc, newবা copy(বা আপনি যেটিকে retainমূলত ডেকেছিলেন ) কেবল প্রকাশ করুন।

@ ব্লুম এখানে এসওতে এবং তার ব্লগে আরও বিশদে এটি সেরা বলেছেন ।


8
কারণ আপনি ভাবেন যে আপনি মেমরি গণনা করছেন তবে আপনি এটি ভুল করছেন।
আবাইজার্ন

@ অ্যাবিজার্ন - এবং অন্য উত্তরের একটিতে সিঙ্গলটন পরিস্থিতি সম্পর্কে কী?
মোসজি

3
এটি যোগ করার জন্য, আপনি যে কোনও তথ্য থেকে -retainCountউপার্জন করতে পারবেন তা ইনস্ট্রুমেন্টস এবং এর সরঞ্জামগুলি থেকে পাওয়া যাবে (আরও বিস্তারিতভাবে)।
ডেভ দেলং

3
ডেভ যা বলেছিল তা যুক্ত করতে; কোনও বস্তুর নিরঙ্কুশ ধরে রাখা গণনা একটি বাস্তবায়ন বিশদ। উভয় বস্তুর অভ্যন্তরের বিশদ বিবরণ এবং / বা অন্য যে কোনও বস্তুর বিশদটি সেই সামগ্রীর মধ্য দিয়ে গেছে। কল করা হচ্ছে retain, retain, retain, autorelease, autorelease, autoreleaseUIKit API এর মাধ্যমে একটি বস্তু ক্ষণস্থায়ী, উদাহরণস্বরূপ একটি পুরোপুরি বৈধ ফলাফল হতে পারে।
bbum

2
@ d11wtq যদি রিটেনকাউন্ট কখনও == 0 হয় তবে এককতা অর্জন করা হয়েছে!
9:41

14

স্বতঃস্ফুর্ত বস্তু হ'ল এমন একটি ক্ষেত্রে যেখানে -আরেন্টকাউন্ট চেক করা অবিজ্ঞাত এবং সম্ভাব্য বিভ্রান্তিকর। রক্ষণ গণনাটি আপনাকে কোনও বস্তুতে কতবার -উতোরলেজ ডাকা হয়েছিল এবং অতএব বর্তমান অটোরলেলেজ পুল নিকাশী হলে এটি কতবার প্রকাশিত হবে সে সম্পর্কে আপনাকে কিছুই জানায় না।


1
ধন্যবাদ - এটি একটি ভাল পয়েন্ট। এটিই প্রথম উত্তর যা জেনেরিক "না" এর পাশাপাশি রিটেনকাউন্ট ব্যবহার করবেন না কেন তার কারণের কারণ রয়েছে described
মোসজি

1
@ মোসজি: আপনার প্রশ্নটি ছিল "রিটেনকাউন্ট কখন ব্যবহার করবেন?" - আপনি যদি এই প্রশ্নটি জিজ্ঞাসা করার অর্থ না দিয়ে থাকেন তবে আপনার অন্য কিছু জিজ্ঞাসা করা উচিত ছিল।
ছক

@ চক - আসলে আমি "কখন এটি ব্যবহার করব" সে বিষয়ে আগ্রহী ছিলাম, তবে মনে হয় যে প্রতিটি উত্তর "কখনই" হবে না ... তবে - আমার ধারণা আপনি ঠিকই আছেন। আমি প্রশ্নটি কয়েক দিনের জন্য খোলা রেখে দেব, এবং যদি অন্য কোনও উত্তর না থেকে থাকে তবে কখনই না, তবে আমি উত্তর হিসাবে "কখনই" গ্রহণ করব না।
মোসজি

10

'ইনস্ট্রুমেন্টস' ব্যবহার করে চেক করা হলে আমি রক্ষণাবেক্ষণগুলি খুব দরকারী মনে করি

'বরাদ্দ' সরঞ্জামটি ব্যবহার করে, নিশ্চিত করুন যে 'রেকর্ড রেফারেন্স গণনা' চালু আছে এবং আপনি যে কোনও বস্তুর মধ্যে যেতে পারেন এবং এটির রক্ষণাবেক্ষণের ইতিহাসটি দেখতে পারেন।

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

এটি আমাকে কখনই হতাশ করে না - আইওএসের প্রথম দিকে বিটা রিলিজে বাগ সন্ধান সহ।


5

এনএসবজেক্টে অ্যাপল ডকুমেন্টেশনটি একবার দেখুন, এটি আপনার প্রশ্নটি বেশ কভার করে: এনএসবজেক্ট রেন্টক্যান্ট

সংক্ষেপে, আপনার নিজের রেফারেন্স গণনা সিস্টেমটি প্রয়োগ না করা হলে রিটেনকাউন্ট সম্ভবত আপনার পক্ষে অকেজো (

অ্যাপলের নিজস্ব কথায়, রিটেনক্যান্ট হ'ল মেমরি পরিচালনার সমস্যাগুলি ডিবাগ করার ক্ষেত্রে সাধারণত কোনও মূল্য থাকে না no


প্রথমে আপনাকে জবাব দেওয়ার জন্য ধন্যবাদ। সাধারণত এই প্রশ্নের লোকজনের প্রতিক্রিয়া হ'ল "কখনই না"। (উত্তর দেখুন)। আসলে "ডিবাগিংয়ের কোনও মূল্য নেই" এর অর্থ "কখনই নয়"। সুতরাং আমার প্রশ্নটি হল - কেন এটি ব্যবহার না করার দৃ feeling় অনুভূতি হয় (উদাহরণস্বরূপ সিঙ্গলটন বাস্তবায়নে - আবার একটি উত্তর)?
মোসজি

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

1
@ মোসজি: ডিবাগিং হ'ল একমাত্র পরিস্থিতি যেখানে বেশিরভাগ লোকেরা এর মূল্য ধারণ করে তা ধারণা করতে পারে, সুতরাং যদি এটি বিশ্বাসযোগ্য না হয় তবে এটি কখনই কার্যকর হয় না। আপনি অন্য কোন ব্যবহারের কথা ভাবছেন?
চক

4

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

আপনার দৃষ্টিভঙ্গি তৈরির প্রয়াসে আপনি গুরুত্বের অনির্বচনীয় প্রকৃতিরটিকে গুরুত্বের সাথে উজাড় করে দিয়েছিলেন। এটি সত্য যে এটি সর্বদা রেফারেন্স গণনা হয় না। কিছু বিশেষ মান রয়েছে যা পতাকাগুলির জন্য ব্যবহৃত হয়, উদাহরণস্বরূপ বোঝাতে যে কোনও বস্তু কখনই বিলোপযুক্ত হওয়া উচিত নয়। 1152921504606846975 এর মতো একটি নম্বর আপনি হেক্সে লিখে এবং 0xfffffffffffffff না পাওয়া অবধি খুব রহস্যময় লাগছে। এবং 9223372036854775807 হেক্সে 0x7fffffffffffffff। এবং এটি সত্যিই এত অবাক হওয়ার মতো নয় যে কোনও ব্যক্তি পতাকা হিসাবে এই জাতীয় মানগুলি বেছে নিতে বেছে নিবে যে আপনি প্রতি সেকেন্ডে রিটেনট্যান্ট 100,000,000 বার বর্ধিত বলে ধরে নিবেন যে বড় সংখ্যার চেয়ে বেশি একটি রিটেনকাউন্ট পেতে প্রায় 3000 বছর সময় লাগবে।


3

এটি ব্যবহার করে আপনি কী সমস্যা পেতে পারেন? এটি যা করে তা হ'ল অবজেক্টের ধরে রাখা গণনা। আমি কখনই এটি কল করি নি এবং আমি যে কারণ করব তা ভাবতে পারি না। আমি যদিও এটি সিলেটনে না ফেলেছি তা নিশ্চিত করার জন্য এটি সিলেটনে ওভাররাইড করেছে।


2
সিঙ্গলটন ক্ষেত্রে এটিকে ওভাররাইড করার কোনও কারণ নেই। ফাউন্ডেশন / কোরফাউন্ডেশনে এমন কোনও কোড পাথ নেই যা retainCountমেমরি পরিচালনার জন্য ব্যবহার করে ।
বুবুম

রিলিজ এটি dealloc কল করা উচিত কিনা তা সিদ্ধান্ত নিতে ব্যবহার করে না?
ughoavgfhw

2
নাঃ; কোর্টফাউন্ডেশনের অভ্যন্তরীণ রক্ষণাবেক্ষণ / রিলিজ / অটোরিলেজের গভীর শিকড় রয়েছে এবং আপনি যা আশা করতে পারেন তা সত্যিই নয়। কোরফাউন্ডেশন উত্সটি ধরুন (এটি উপলভ্য) এবং একবার দেখুন।
9:41

3

আপনার অ্যাপটি চালু না হওয়া এবং চালিত হওয়া এবং দরকারী কিছু না করা পর্যন্ত আপনার মেমরি ফাঁস হওয়ার বিষয়ে চিন্তা করা উচিত নয়।

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

আপনার কোডটি লেখার সাথে সাথে চেষ্টা করুন এবং এটি অপ্টিমাইজ করবেন না, যখন আপনি আসলে অ্যাপ্লিকেশনটি সাধারণত ব্যবহার করেন তখন আপনার মেমরিটি কী মেমরি ফাঁস হতে পারে বা খুব বেশি সময় নিতে পারে সে সম্পর্কে আপনার অনুমানগুলি প্রায়ই ভুল হয় are

সঠিক কোড চেষ্টা করুন এবং লিখুন যেমন আপনি যদি বরাদ্দ এবং এই জাতীয় ব্যবহার করে কোনও বিষয় তৈরি করেন তবে নিশ্চিত হয়ে নিন যে আপনি এটি সঠিকভাবে প্রকাশ করেছেন release


0

আপনার কোডটিতে এটি কখনও ব্যবহার করা উচিত নয়, তবে এটি ডিবাগ করার সময় অবশ্যই সহায়তা করতে পারে


0

কখনই আপনার কোড -আরেন্টকাউন্ট ব্যবহার করবেন না। তবে আপনি যদি ব্যবহার করেন তবে আপনি কখনই এটি শূন্যের দিকে ফিরে দেখতে পাবেন না। কেন তা ভেবে দেখুন। :-)


0

ডেভের পোস্টে ব্যবহৃত উদাহরণগুলি হ'ল এনএসএনবার এবং এনএসএসআর্টিংস ... সুতরাং, আপনি যদি ইউআইভিউউজের মতো আরও কিছু ক্লাস ব্যবহার করেন তবে আমি নিশ্চিত যে আপনি সঠিক উত্তরটি পাবেন (রক্ষণ গণনা বাস্তবায়নের উপর নির্ভর করে এবং এটি অনুমানযোগ্য)।

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