এআরসি ব্যবহার করার সময় এবং আইওএস ৪.০ লক্ষ্য করে আমি কীভাবে দুর্বল রেফারেন্সগুলি প্রতিস্থাপন করব?


87

আমি এক্সকোড ৪.২ দিয়ে আমার প্রথম আইওএস অ্যাপটি বিকাশ করা শুরু করেছি এবং "ইউটিলিটি অ্যাপ্লিকেশন" টেম্পলেট (যেটি একটি ফ্লিপসাইডভিউ কনট্রোলারের সাথে আসে) দ্বারা আইওএস 5.0 কে টার্গেট করছিলাম।

আমি পড়েছি যেহেতু এআরসি একটি সংকলন-সময় বৈশিষ্ট্য, তাই এটি আইওএস 4 এর সাথেও সামঞ্জস্যপূর্ণ হওয়া উচিত, তাই আমি আমার অ্যাপ্লিকেশনটিকে 4.3 তে টার্গেট করার চেষ্টা করেছি এবং এটি সংকলনের চেষ্টা করেছি। আমি যখন এটি করি তখন আমি এই ত্রুটিটি পাই:

ফ্লিপসাইডভিউকন্ট্রোলআরএম: ত্রুটি: স্বয়ংক্রিয় রেফারেন্স গণনা ইস্যু: বর্তমান স্থাপনার টার্গেটটি স্বয়ংক্রিয় পদ্ধতিতে সমর্থন করে না __সামান্য রেফারেন্স

এটি এই লাইনটি উল্লেখ করছে:

@synthesize delegate = _delegate;

এই পরিবর্তনশীল হিসাবে ঘোষণা করা হয়:

@property (weak, nonatomic) IBOutlet id <FlipsideViewControllerDelegate> delegate;

আমি বুঝতে পারি যে আইওএস 4 এ "দুর্বল রেফারেন্স" সমর্থিত নয় তবে আমি কেন বুঝতে শুরু করি না কেন আমি দুর্বল রেফারেন্সটি শুরু করতে ব্যবহার করব এবং এটি ব্যবহার এড়াতে কীভাবে জিনিসগুলি পুনরায় লিখতে হবে তা আমি বুঝতে পারি না, যখন এখনও আরসি এর সুবিধা নিচ্ছে (সর্বোপরি, এটি আইওএস 4 এবং 5 এর সাথে কাজ করার কথা?)

উত্তর:


149

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

ধরে রাখার চক্র এড়াতে আপনি এটি করেন, যা আমি এখানে আমার উত্তরে উল্লেখ করি । আপনি এমন কোনও কিছুর শক্তিশালী পয়েন্টার রাখতে চান না যার মুল অবজেক্টটিতে মূল পয়েন্টারটি থাকতে পারে। তাহলে কিছুই ঠিকমতো মুক্তি পেত না।


পরামর্শের জন্য ধন্যবাদ. আপনি "পুরানো ওএসকে লক্ষ্য করার জন্য ..." বলেছিলেন। এর অর্থ কি আমার 5.0 এর চেয়ে পুরানো অ্যাপ্লিকেশনগুলিতে কেবল অনিরাপদ_আর রক্ষিত ব্যবহার করা উচিত? বা আমি কি আমার কোডটিতে কেবল অনিরাপদ_অনরক্ষিত ব্যবহার করতে পারি এবং এটি 4.x এবং 5.x উভয়কে লক্ষ্য করে তৈরি করতে পারি?
ম্যাসন জি। ঝুইটি

4
@ ম্যাসন - unsafe_unretainedআইওএস ৪.০ এবং ৫.০ উভয় ক্ষেত্রেই সমর্থিত, সুতরাং এটি আপনাকে পিছনের সামঞ্জস্য দেয়। আপনি যদি কেবল 5.0-বিল্ড করছিলেন weakতবে আপনি যে অতিরিক্ত সুরক্ষার ব্যবস্থা করবেন সেটির সুযোগ নিতে আপনি স্যুইচ করতে পারেন।
ব্র্যাড লারসন

আমি অনিরাপদ_ অরক্ষিত চেষ্টা করেছি, এটি যাইহোক কাজ করেছে। যাইহোক, আমি "" ** __NS আউটরেলেজ নোপুল () এর মতো বিষয়টির সতর্কতা পেয়েছি: ক্লাস __NSArrayM এর 0x564bd90 অবজেক্টটি কোনও পুলের সাথে অটোরেলিজ হয়েছে - কেবল "*" ফাঁস হচ্ছে, এটাই কি স্বাভাবিক?
পঞ্চম

4
@ পঞ্চম - এটি একটি সম্পূর্ণ সম্পর্কহীন সমস্যা। আপনি জায়গায় অটোরলেজ পুল না রেখে ব্যাকগ্রাউন্ড থ্রেডে কিছু চালাচ্ছেন। ম্যানুয়ালি তৈরি থ্রেডগুলির নিজস্ব অটোরিলেজ পুল নেই, সুতরাং আপনাকে নিজের দ্বারা একটি তৈরি করতে হবে @autoreleasepool(পুরানো ম্যানুয়ালি রেফারেন্স গণনা করা বাস্তবায়নের জন্য এআরসি, এনএসটোরলেজপুল)।
ব্র্যাড লারসন

@ ব্র্যাড, এটি সহায়ক, সতর্কবাণীগুলি চলে গেছে, আমি বেশ কয়েকটি সঞ্চালনকারীর নির্বাচকআইনব্যাকগ্রাউন্ড কল পেয়েছি।
পঞ্চম

11

অতিরিক্ত সুরক্ষার জন্য যদি কেবল দুর্বল রেফারেন্স ব্যবহার করা হয় তবে নতুন রানটাইম ফাংশনগুলি উপলভ্য থাকলে ম্যানুয়ালি কল করুন এবং __unsafe_unretainedযদি না হয় তবে ভেরিয়েবলগুলিতে সাধারণ অ্যাসাইনমেন্টে ফলব্যাক করুন ।

ZWRCompatibility.h এটিকে কিছুটা সহজ করবে।


10

মাইক অ্যাশের সামঞ্জস্যযোগ্য লাইব্রেরি PLWeakCompatibilty আপনাকে ধন্যবাদ , আপনি এখন কেবল আইওএস 4.x এও __weak ব্যবহার করতে পারেন।

এটি কনফিগার করা অবিশ্বাস্যরূপে সহজ এবং 5x এর বেশি কোনও বিবেচনা বা প্রচেষ্টা দরকার নেই।

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