এআরসি কি কিউ প্রেরণ সমর্থন করে?


95

আমি "ডিসপ্যাচ ক্যুয়ের জন্য মেমরি ম্যানেজমেন্ট" সম্পর্কে অ্যাপলের ডকুমেন্টেশন পড়ছি:

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

আমি জানি যে এআরসি কোনও আবর্জনা সংগ্রহকারী নয় তবে আমি নিশ্চিত হতে চাই যে আমার প্রেরণ_প্রেরণ এবং প্রেরণ_আমার দয়া করে আমার প্রেরণ_কুই_টি দরকার নেই

উত্তর:


234

সংক্ষিপ্ত উত্তর: হ্যাঁ, এআরসি প্রেরণ সারিগুলি ধরে রেখেছে এবং প্রকাশ করে।







এবং এখন দীর্ঘ উত্তরের জন্য ...

যদি আপনার স্থাপনার লক্ষ্যটি আইওএস 6.0 বা ম্যাক ওএস এক্স 10.8 এর চেয়ে কম হয়

আপনার ব্যবহার dispatch_retainএবং dispatch_releaseআপনার সারিতে থাকা দরকার। এআরসি এগুলি পরিচালনা করে না।

আপনার স্থাপনার লক্ষ্যটি যদি আইওএস 6.0 বা ম্যাক ওএস এক্স 10.8 বা তার পরে হয়

এআরসি আপনার জন্য আপনার সারিটি পরিচালনা করবে। আপনার প্রয়োজন (এবং না পারে) ব্যবহার করতে হবে না dispatch_retainবা dispatch_releaseএআরসি সক্ষম থাকলে।

বিশদ

আইওএস 6.0 এসডিকে এবং ম্যাক ওএস এক্স 10.8 এসডিকে থেকে শুরু করে প্রতিটি প্রেরণ বস্তু (ক সহ dispatch_queue_t) এছাড়াও একটি উদ্দেশ্য-সি অবজেক্ট। এটি <os/object.h>শিরোলেখ ফাইলটিতে নথিযুক্ত:

 * By default, libSystem objects such as GCD and XPC objects are declared as
 * Objective-C types when building with an Objective-C compiler. This allows
 * them to participate in ARC, in RR management by the Blocks runtime and in
 * leaks checking by the static analyzer, and enables them to be added to Cocoa
 * collections.
 *
 * NOTE: this requires explicit cancellation of dispatch sources and xpc
 *       connections whose handler blocks capture the source/connection object,
 *       resp. ensuring that such captures do not form retain cycles (e.g. by
 *       declaring the source as __weak).
 *
 * To opt-out of this default behavior, add -DOS_OBJECT_USE_OBJC=0 to your
 * compiler flags.
 *
 * This mode requires a platform with the modern Objective-C runtime, the
 * Objective-C GC compiler option to be disabled, and at least a Mac OS X 10.8
 * or iOS 6.0 deployment target.

এর অর্থ হল আপনি আপনার সারিতে একটি সঞ্চয় করতে পারে NSArrayবা NSDictionaryবা এক সঙ্গে একটি সম্পত্তি এ, strong, weak, unsafe_unretained, assign, অথবা retainবৈশিষ্ট্যাবলী। এর অর্থ হ'ল আপনি যদি কোনও ব্লক থেকে আপনার সারিটি উল্লেখ করেন তবে ব্লকটি স্বয়ংক্রিয়ভাবে সারিটি ধরে রাখবে।

তাই যদি আপনার স্থাপনার লক্ষ্য অন্তত আইওএস 6.0 বা ম্যাক OS X 10.8 এবং আপনি এআরসি সক্ষম করা , এআরসি ধরে রাখা হবে এবং আপনার কিউ মুক্তি, এবং কম্পাইলার ইচ্ছা ফ্ল্যাগ ব্যবহার কোনো প্রয়াস dispatch_retainবা dispatch_releaseএকটি ত্রুটি হিসাবে।

যদি আপনার স্থাপনার টার্গেটটি কমপক্ষে আইওএস 6.0 বা ম্যাক ওএস এক্স 10.8 হয় এবং আপনি আরসি অক্ষম করে থাকেন , আপনাকে অবশ্যই নিজের সারিটি ধরে রাখতে এবং ছেড়ে দিতে হবে, হয় কল করে dispatch_retainএবং dispatch_release, বা সারি retainএবং releaseবার্তা (যেমন [queue retain]এবং [queue release]) প্রেরণ করে ।

পুরাতন codebases সাথে সামঞ্জস্যের জন্য, আপনি সংজ্ঞায়িত দ্বারা একটি উদ্দেশ্য সি অবজেক্ট হিসেবে আপনার সারিতে দেখে কম্পাইলার প্রতিরোধ করতে পারি OS_OBJECT_USE_OBJCকরতে 0। উদাহরণস্বরূপ, আপনি এটি আপনার .pchফাইলে রাখতে পারেন (কোনও #importবিবৃতি দেওয়ার আগে ):

#define OS_OBJECT_USE_OBJC 0

অথবা আপনি OS_OBJECT_USE_OBJC=0আপনার বিল্ড সেটিংসে প্রিপ্রোসেসর ম্যাক্রো হিসাবে যুক্ত করতে পারেন । আপনি যদি সেট OS_OBJECT_USE_OBJCকরে রাখেন 0, এআরসি আপনার জন্য আপনার সারিটি ধরে রাখতে বা ছাড়বে না এবং আপনাকে এটি ব্যবহার করে dispatch_retainএবং নিজেই করতে হবে dispatch_release


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

4
একটি আকর্ষণীয় প্রান্ত মামলা আছে। যদি আপনার লাইব্রেরিটি আইওএস 5.1 এবং আপনার অ্যাপ্লিকেশনটি 6.0 তে স্থাপন করে এবং আপনি আরসি ব্যবহার করছেন, আপনাকে আপনার 5.1 কোডের মধ্যে dispatch_release এবং NULL অবজেক্টটি প্রয়োজন dealloc। অন্যথায়, কিছু (সংকলক দ্বারা উত্পন্ন কোড? রানটাইম নিজেই?) দ্বিতীয় বার অবজেক্টটি প্রকাশ করার চেষ্টা করবে।
স্টিভেন ফিশার

ম্যাক ওএস 10.7 ব্যবহার করার সময় কি আমি তৈরি অন্যান্য উত্স অবজেক্টগুলি প্রেরণ করা দরকার?
p0lAris

আপনাকে অবশ্যই OS X 10.7 এর অধীনে সমস্ত GCD অবজেক্ট ম্যানুয়ালি ধরে রাখতে / ছেড়ে দিতে হবে।
রব মায়ফ

23

এখানে কেবল অনুসরণ করুন ... আপনার সর্বনিম্ন স্থাপনার লক্ষ্য যদি আইওএস 6 হয় তবে এআরসি এখন সেগুলি পরিচালনা করে।


এটি মাউন্টেন সিংহের ক্ষেত্রেও প্রযোজ্য। যদি আপনার স্থাপনার টার্গেট আইওএস 6 বা মাউন্টেন লায়ন হয় তবে আপনি (ডিফল্টরূপে) ডিসপ্যাচ_রেলেজ ব্যবহার করতে পারবেন না কারণ এটি একটি ম্যাক্রো যা এআরসি এর আওতায় অনুমোদিত নয় এমন কোনও বস্তুর কাছে একটি রিলিজ বার্তা প্রেরণ করে।
এমিল এরিকসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.