উদ্দেশ্য-সিতে স্বয়ংক্রিয় রেফারেন্স গণনা কোন ধরণের ফাঁস প্রতিরোধ বা হ্রাস করে না?


235

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

এক্সকোড ৪.২ সহ যে সরঞ্জাম সরঞ্জামটি আসে তা এলএলভিএম সংকলকের সর্বশেষতম সংস্করণ সহ স্বয়ংক্রিয় রেফারেন্স গণনা (এআরসি) প্রবর্তন করে , যা আপনার জন্য আপনার স্টাফের স্মৃতি-পরিচালনার জন্য সংকলকটি পাওয়ার মাধ্যমে এই সমস্যাটি পুরোপুরি সরিয়ে দেয়। এটি বেশ দুর্দান্ত, এবং এটি প্রচুর অযৌক্তিক, জাগতিক বিকাশের সময় কেটে দেয় এবং যথাযথ বজায় রাখা / মুক্তির ভারসাম্যের সাথে সংশোধন করা সহজ এমন অনেক অসতর্কতা মেমরি ফাঁস প্রতিরোধ করে। এমনকি আপনি যখন আপনার ম্যাক এবং আইওএস অ্যাপ্লিকেশনগুলির জন্য আরসি সক্ষম করেন তখন অটোরিলিজ পুলগুলি আলাদাভাবে পরিচালনা করা প্রয়োজন (যেহেতু আপনাকে নিজের নিজের বরাদ্দ দেওয়া উচিত নয় NSAutoreleasePool)।

কিন্তু কি অন্যান্য এটি মেমরি তথ্য ফাঁসের নেই না প্রতিরোধ আমি এখনও জন্য সতর্ক আছে?

বোনাস হিসাবে, ম্যাক ওএস এক্স এবং আইওএস এ আরসি এবং ম্যাক ওএস এক্সে আবর্জনা সংগ্রহের মধ্যে পার্থক্যগুলি কী?

উত্তর:


262

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

এটি এই কারণেই __unsafe_unretainedএবং __weakমালিকানার যোগ্যতা বিদ্যমান। প্রাক্তন এটি চিহ্নিত করে এমন কোনও বস্তু ধরে রাখবে না, তবে পাতাগুলি সেই অবজেক্টের দূরে যাওয়ার সম্ভাবনাটি খোলে এবং এটি খারাপ স্মৃতির দিকে ইঙ্গিত করে, যদিও পরেরটি বস্তুটি ধরে রাখে না এবং লক্ষ্য স্থির হয়ে গেলে স্বয়ংক্রিয়ভাবে শূন্য হয়ে যায়। দুটির __weakমধ্যে সাধারণত এটি সমর্থন করে এমন প্ল্যাটফর্মগুলিতে পছন্দ করা হয়।

আপনি এই কোয়ালিফায়ারকে প্রতিনিধিদের মতো জিনিসের জন্য ব্যবহার করবেন যেখানে আপনি চান না যে অবজেক্টটি তার প্রতিনিধি ধরে রাখতে পারে এবং সম্ভাব্যভাবে একটি চক্রের দিকে পরিচালিত করে।

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

এগুলি ছাড়াও আরও বেশ কয়েকটি ঘন ঘন ঘন ঘন, তবে এখনও সম্ভাব্য সমস্যাযুক্ত মামলা রয়েছে যা প্রকাশিত স্পেসিফিকেশনটি বিশদে বিশদে চলে গেছে।

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

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

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


2
বিস্তারিত উত্তরের জন্য ধন্যবাদ। আমার একই সমস্যা ছিল যেখানে আমি _উনসেফ_নরেন্টিভের অধীনে একটি প্রতিনিধিকে সংজ্ঞায়িত করেছি এবং আমার অ্যাপ্লিকেশন ক্র্যাশ হয়ে গেছে, পরে এটি শক্তিশালী করে পরিবর্তন করে ঠিক করেছি তবে এখন এটির একটি স্মৃতি ফাঁস হয়েছে। সুতরাং, আমি এটিকে দুর্বল করে দিয়েছি এবং কবজির মতো কাজ করি।
চতুরাম

@ আইছথুরা বাহ! আপনি আমাকে আরসি মাইর থেকে বাঁচিয়েছেন। সিএমপপটিপভিউ ব্যবহার করার সময় আমি একই ক্রাশের মুখোমুখি হয়েছি।
নিলিয়ানিয়ং

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

ব্র্যাড, ক্রিস ল্যাটনার লিঙ্কটি মারা গেছে । আমি 100% নই তবে আমি এই অন্যান্য লিঙ্কটি পেয়েছি। যা আমি মনে করি আপনি যা লিঙ্ক করতে চেয়েছিলেন তা হল: list.swift.org/pipermail/swift-evolution/Week-of- Mon
মধু

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

14

এআরসি আপনাকে নন-ওবিজসি মেমরির সাহায্য করবে না, উদাহরণস্বরূপ যদি আপনি malloc()কিছু করেন তবে আপনার free()এটি এখনও দরকার ।

performSelector:সংকলক নির্বাচক কী তা নির্ধারণ করতে না পারলে এআরসি দ্বারা বোকা বানানো যেতে পারে (সংকলক তাতে সতর্কতা উত্পন্ন করবে)।

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


7

নিম্নলিখিত 4 টি সমস্যার কারণে আমি আমার অ্যাপ্লিকেশনটিতে মেমরি ফাঁসের অভিজ্ঞতা পেয়েছি:

  1. ভিউ কন্ট্রোলারদের বরখাস্ত করার সময় এনএসটিমোরগুলিকে অবৈধ নয়
  2. ভিউ কন্ট্রোলারকে বরখাস্ত করার সময় কোনও পর্যবেক্ষককে এনএসএনটিফিকেশনসেন্টারে অপসারণ করতে ভুলে যাচ্ছেন।
  3. ব্লকগুলিতে নিজের সম্পর্কে দৃ strong় উল্লেখ রাখা।
  4. নিয়ন্ত্রণকারী বৈশিষ্ট্যগুলিতে প্রতিনিধিদের শক্তিশালী রেফারেন্স ব্যবহার করা

ভাগ্যক্রমে আমি নিম্নলিখিত ব্লগ পোস্টটি জুড়ে এসেছি এবং সেগুলি সংশোধন করতে সক্ষম হয়েছি: http://www.reigndesign.com/blog/debugging-retain-cycles-in-objective-c-four- Likely-culprits/


0

এআরসি কোরফাউন্ডেশন প্রকারগুলি পরিচালনাও করবে না। আপনি সেগুলি 'ব্রিজ' করতে পারেন (ব্যবহার করে CFBridgingRelease()) তবে আপনি যদি এটি অবজেক্টিভ সি / কোকো অবজেক্ট হিসাবে ব্যবহার করতে চলেছেন তবে। নোট করুন যে সিএফব্রিডিংরিলেজ কেবলমাত্র কোরফাউন্ডেশনকে গণনা বজায় রেখে 1 টি হ্রাস করে এবং এটি উদ্দেশ্য-সি এর এআরকে স্থানান্তরিত করে।


0

এক্সকোড 9 এই ধরণের সমস্যাগুলি সন্ধানের জন্য দুর্দান্ত সরঞ্জাম সরবরাহ করে। একে বলা হয়: " ডিবাগ মেমরি গ্রাফ "। এটি ব্যবহার করে আপনি শ্রেণির ধরণ অনুসারে আপনার ফাঁস হওয়া বস্তুটি আবিষ্কার করতে পারেন এবং আপনি পরিষ্কারভাবে দেখতে পাচ্ছেন যে এর দৃ who় রেফারেন্স কে রাখে, সেখান থেকে ছেড়ে দিয়ে আপনার সমস্যার সমাধান করে। এটি মেমোরি চক্র সনাক্ত করে।

এটি কীভাবে ব্যবহার করবেন সে সম্পর্কে আরও তথ্য দেখুন

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