এআরসি এবং ব্রিজড কাস্ট


166

এআরসি, আমি আর কাস্ট করতে পারেন CGColorRefথেকে id। আমি শিখেছি যে আমার একটি ব্রিজড কাস্ট করা দরকার। ঝনঝন ডক্স অনুযায়ী :

একটি ব্রিজযুক্ত castালাই হ'ল সি-স্টাইলের threeালাই যা তিনটি কীওয়ার্ডের মধ্যে একটিতে টিকা দেওয়া হয়:

(__bridge T) opগন্তব্য প্রকারে অপারেন্ডকে কাস্ট করে T। যদি T একটি ধারণযোগ্য অবজেক্ট পয়েন্টার টাইপ হয় তবে opঅবশ্যই একটি বহনযোগ্য পয়েন্টার টাইপ থাকা উচিত। যদি Tএকটি অ-রক্ষণযোগ্য পয়েন্টার টাইপ হয়, তবে অপের অবশ্যই একটি ধারণযোগ্য অবজেক্ট পয়েন্টার টাইপ থাকতে হবে। অন্যথায় নিক্ষিপ্তটি দুর্গঠিত। মালিকানার কোনও স্থানান্তর নেই, এবং এআরসি কোনও রক্ষণাবেক্ষণের কাজ সন্নিবেশ করে না।

(__bridge_retained T) opঅপারেনডকে কাস্ট করে, যার অবশ্যই গন্তব্য প্রকারের কাছে ধরে রাখতে সক্ষম অবজেক্ট পয়েন্টার টাইপ থাকতে হবে, যা অবশ্যই একটি অ-রক্ষণযোগ্য পয়েন্টার টাইপ হতে হবে। এআরসি স্থানীয় মানগুলিতে স্বাভাবিক অপ্টিমাইজেশনের সাপেক্ষে মানটি ধরে রাখে এবং প্রাপক +1 এর ভারসাম্য বজায় রাখার জন্য দায়বদ্ধ।

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

এআরসি নিয়ন্ত্রণের ও বাইরে অবজেক্টগুলি স্থানান্তর করার জন্য এই ক্যাসেটগুলি প্রয়োজনীয়; ধারণযোগ্য অবজেক্ট পয়েন্টার রূপান্তরকরণের বিভাগে যুক্তিটি দেখুন।

এআরসিকে ভারসাম্যহীন ধরে রাখতে বা মুক্তি দিতে যথাক্রমে এআরকে বোঝানোর জন্য একটি __bridge_retainedবা __bridge_transferকাস্ট ব্যবহার করা দুর্বল রূপ।

কোন পরিস্থিতিতে আমি প্রতিটি ব্যবহার করব?

উদাহরণস্বরূপ, CAGradientLayerএর একটি colorsসম্পত্তি রয়েছে যা CGColorRefএস এর অ্যারে গ্রহণ করে । আমার অনুমান যে আমার __brigeএখানে ব্যবহার করা উচিত তবে ঠিক কেন আমার উচিত (বা করা উচিত নয়) তা অস্পষ্ট।


17
আপনি কি ডাব্লুডাব্লুডিসি 2011 সেশন 323 টি দেখেছেন? এটি এআরসি আমার এখানে চেয়ে আরও ভাল ব্যাখ্যা করে। এটি শুরু থেকে শেষ পর্যন্ত সমস্ত বিবরণ জুড়ে। এটি অবশ্যই প্রতিটি ম্যাক / আইওএস বিকাশকারীদের জন্য সেশন দেখতে হবে।
rbrown

এটি খুব সহায়তা করতে পারে: stackoverflow.com/questions/14352494/…
ইভান মেলর

ডাব্লুডাব্লুডিসি অধিবেশনটির লিঙ্ক, এটি খুঁজে পাওয়া তুচ্ছ ছিল না: developer.apple.com/videos/play/wwdc2011/323 - প্রাসঙ্গিক বিট
ড্যানিয়েল

উত্তর:


215

আমি সম্মত হই যে বর্ণনাটি বিভ্রান্তিকর। যেহেতু আমি কেবল তাদের উপলব্ধি করেছি, তাই সংক্ষেপে জানার চেষ্টা করব:

  • (__bridge_transfer <NSType>) opবা বিকল্পভাবে CFBridgingRelease(op)এটিআরসি-তে CFTypeRefস্থানান্তরিত করার সময় কিছুক্ষণ ধরে রাখার গণনা গ্রহণ করতে ব্যবহৃত হয় । এটি দ্বারা প্রতিনিধিত্ব করা যেতে পারেid someObj = (__bridge <NSType>) op; CFRelease(op);

  • (__bridge_retained <CFType>) opঅথবা বিকল্পভাবে সিএফ-জমিটিকে একটি +1 ধরে রাখার গণনা দেওয়ার সময় CFBridgingRetain(op)একটি NSObjectহস্তান্তর করতে ব্যবহৃত হয় । আপনি CFTypeRefযেমন তৈরি করেছেন তেমন হ্যান্ডেল করা উচিত যেমন আপনি কোনও ফলাফলকে পরিচালনা করেন CFStringCreateCopy()। এটি দ্বারা প্রতিনিধিত্ব করা যেতে পারেCFRetain((__bridge CFType)op); CFTypeRef someTypeRef = (__bridge CFType)op;

  • __bridgeপয়েন্টার-ল্যান্ড এবং অবজেক্টিভ-সি অবজেক্ট-ল্যান্ডের মধ্যে কেবল কাস্ট করুন। যদি আপনার উপরের রূপান্তরগুলি ব্যবহার করার প্রবণতা না থাকে তবে এটি ব্যবহার করুন।

হতে পারে এটি সহায়ক। নিজেই, আমি CFBridging…প্লেইন ক্যাসেটগুলির চেয়ে বেশ খানিকটা ম্যাক্রোগুলি পছন্দ করি ।


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

2
একবার এআরসি জমিতে আপনি আর শক্তিশালী এবং দুর্বল রেফারেন্স সম্পর্কে কেবল আর গণনা রক্ষার কথা ভাবেন না।
বানরদোম

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

3
আসলে তা না. আপনাকে কেবল এআরসি জমির বাইরে যাওয়া বা ভাবতে হবে। এবং এটি অটোরিলেসিংকে আঁকড়ে ধরার যথেষ্ট স্মরণীয়। (আকর্ষণীয়ভাবে যথেষ্ট: এআরসি একটি সাধারণ প্যাটার্নটি ঠিক করে যেমন একটি অভিধান থেকে কোনও জিনিস বের করে নেওয়া এবং এটি ব্যবহারের আগে এটি মুছে ফেলা ইত্যাদি)
বানরদোম

3
অ্যানালাইজার সরঞ্জামটি ব্যবহার করে (শিফট + কমান্ড + বি) এই জাতীয় সন্দেহ সমাধানে সহায়তা করতে পারে, কারণ বর্তমান কোডটি মেমরি ফাঁস করে দিলে এটি একটি প্রাকৃতিক ভাষায় আপনাকে জানাবে। যদি এটি হয়, আপনি সম্ভবত একটি রক্ষণাবেক্ষণের কাস্ট ব্যবহার করছেন যখন আপনার অ-রক্ষণাবেক্ষণের castালাই ব্যবহার করা উচিত। বিশ্লেষক যদি সেই কোড লাইনের কোনও বিষয়ে আপনাকে সতর্ক না করে তবে আপনি সম্ভবত বর্তমান কোডটি দিয়ে ভাল করছেন
ফ্যাবিও নেপোডানো

55

আইওএস ডকুমেন্টেশনে আমি আরও একটি ব্যাখ্যা পেয়েছি যা আমি মনে করি যে এটি বোঝা সহজ:

  • __bridge মালিকানা হস্তান্তর না করে অবজেক্টিভ-সি এবং কোর ফাউন্ডেশনের মধ্যে একটি পয়েন্টার স্থানান্তর করে।

  • __bridge_retained (CFBridgingRetain)একটি কোর ফাউন্ডেশন পয়েন্টারে একটি উদ্দেশ্য-সি পয়েন্টার কাস্ট করে এবং আপনার কাছে মালিকানা স্থানান্তর করে।

    আপনি সিএফআলিজিকে কল করার জন্য বা কোনও সম্পর্কিত ফাংশনটির অবজেক্টটির মালিকানা ত্যাগ করার জন্য দায়বদ্ধ

  • __bridge_transfer (CFBridgingRelease)অবজেক্টিভ সি-তে একটি অ-অবজেক্টিভ-সি পয়েন্টারকে সরায় এবং এআরসি - তেও মালিকানা স্থানান্তর করে।

    এআরসি অবজেক্টের মালিকানা ত্যাগের জন্য দায়বদ্ধ

উত্স: টোল-ফ্রি ব্রিজড প্রকারগুলি


33

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

সুতরাং, তারা নীচের মত কোড ব্যবহার করার পরামর্শ দেয়:

CAGradientLayer *gradientLayer = (CAGradientLayer *)[self layer];
gradientLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor darkGrayColor] CGColor],
                                                 (id)[[UIColor lightGrayColor] CGColor], nil];

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


আপনি যদি পছন্দ করেন তবে সাধারণত আপনি প্রথমে প্রথমে প্রথমে (আইডি) কাস্টিং দিয়ে চলে যেতে পারেন।
ফিলিপ সবুরিন

1
এই প্রশ্নটি এআরসি দিয়ে কাস্টিং সম্পর্কে জিজ্ঞাসা করে, আপনি যে কোডটি আটকে দিয়েছেন তা আইনী নয়।
জোয়ে হ্যাজডর্ন

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