এআরসি -fno-objc-arc ফাইলটি চিহ্নিত করার পরেও স্ট্রাক্ট বা ইউনিয়নে অবজেক্টিভ-সি অবজেক্টগুলিকে নিষিদ্ধ করে


85

এআরসি -fno-objc-arc ফাইলটি চিহ্নিত করার পরেও স্ট্রাক্ট বা ইউনিয়নে অবজেক্টিভ-সি অবজেক্টগুলিকে নিষেধ করে? কেন এমন হয়?

আমার ধারণা ছিল যে আপনি যদি এটি -fno-objc-arc চিহ্নিত করেন তবে আপনার এই বাধা নেই।

উত্তর:


170

আপনি যদি এই বার্তাটি পান তবে __unsafe_unretained চেষ্টা করুন। এটি কেবল নিরাপদ, যদি স্ট্রাক্টের অবজেক্টগুলি অপরিবর্তিত থাকে। উদাহরণ: আপনি যদি আরসি দিয়ে ওপেনফিন্ট ব্যবহার করেন ক্লাস অফব্রেগডেলিগেটস্ট্রিংস স্ট্রাক্টে এই ত্রুটিটি বলে।

typedef struct OFBragDelegateStrings
{
     NSString* prepopulatedText;
     NSString* originalMessage;
} OFBragDelegateStrings;

প্রতি

typedef struct OFBragDelegateStrings
{
     __unsafe_unretained NSString* prepopulatedText;
     __unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;

4
যখন আমি স্ট্রিং বরাদ্দ করি তখন এটির সমস্যা সৃষ্টি হয় যখন এটি অনিরাপদ_রঞ্জিত ভেরিয়েবল অবজেক্টকে রক্ষণযোগ্য অবজেক্ট বরাদ্দকরণের সতর্কতা দেখায়। এবং আমি যখন এটি ক্র্যাশগুলি ব্যবহার করি
দীপক সিং নেগি

8
এটি সমস্ত সমস্যার সমাধান করে না, অবজেক্টটি সাধারণত তাত্ক্ষণিকভাবে মুক্তি দেওয়া হবে এবং এইভাবে অনুপলব্ধ।
ডিজেইট

হ্যাঁ - এটি আসলে কাজ করে না ... সমাধানটি কোনওভাবে উত্পন্ন উত্স ফাইলের জন্য এআরসি বন্ধ করা যা আমি এখনও বের করতে সক্ষম
হইনি

4
আপনি বিল্ড পর্বে ফাইলটিতে -fno-obcc-arc পতাকা যুক্ত করে এটি করেন।
আবিজার্ন

স্ট্রাক্ট ফিল্ডটি যদি কেবল একটি "বোবা রেফারেন্স" হয় এবং অবজেক্টটি আসলে অন্য কোথাও ধরে রাখা হয় (মালিকানাধীন) অন্য কোথাও (বলুন, এর ভিতরে NSArray)? সেক্ষেত্রে এটি অবিলম্বে বিলোপযুক্ত হবে না, তবে আমি অবাক হয়েছি যে
সংকলকটি

30

বরং একটি ব্যবহার তুলনায় struct হয় , আপনি একটি তৈরি করতে পারেন উদ্দেশ্য সি বর্গ পরিবর্তে ডেটা পরিচালনা করতে।


কিভাবে? নমুনা কোথায়?

সুতরাং কেন ছোট ব্যবহারের ক্ষেত্রে কাঠামো তৈরি করতে পারে না?
দেওয়ানশু সায়নী

13

এটি কারণ কারণ চাপটি স্ট্রাক্ট বা ইউনিয়নে অবজেক্টগুলি ট্র্যাক করতে পারে না (যেহেতু তারা প্লেইন সি পয়েন্টারে থাকে)।

যদিও আপনি প্রশ্নযুক্ত ফাইল / শ্রেণি চিহ্নিত করেছেন -fno-objc-arcতবুও এটি চাপ দ্বারা নিয়ন্ত্রিত কোনও বস্তুকে প্যারামিটার হিসাবে দিতে পারে, যার ফলে সম্ভবত মেমরি ফাঁস হতে পারে।


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

আপনি -fno-objc-arcকোনও প্রকল্পের মধ্যে এআরসি এবং নন এআরসি ফাইলগুলি মিশ্রিত করতে ব্যবহার করতে পারেন তবে আপনি যদি স্ট্রাক্ট বা ইউনিয়নের মতো প্লেইন সি কাঠামোগুলি ব্যবহার করেন তবে আপনি আরকি ব্যবহার করতে পারবেন না।
শূন্যতম

ধন্যবাদ ভয়েডস্টারন .. "তবে আপনি যদি কোথাও স্ট্রাক্ট বা ইউনিয়নের মতো সাদামাটা সি কাঠামোগুলি ব্যবহার করেন তবে আপনি আরসি ব্যবহার করতে পারবেন না" " - আমি এটা সত্য মনে করি না। আমি নিজের ফাইলগুলির জন্য এআরসি ব্যবহার করছি। এবং লিভারু ফাইলগুলির জন্য নন-অর্ক। আমি আমার মূল সমস্যাটি যেভাবে ঘুরেছিলাম তা হ'ল মানগুলিতে আলাদাভাবে সি ফাইলে প্রবেশ করানো এবং সেখানে স্ট্রাক্ট তৈরি করা। আমি মনে করি কীটি হ'ল চাপটি আর্ক থেকে নন-আরকে চাপ দেওয়া হয় to
Zsolt

4
কিছুটা হলেও অতিরঞ্জিত হতে পারে। সংক্ষেপে আপনি স্ট্রাক্ট এবং ইউনিয়নগুলিতে বস্তুর পয়েন্টার রাখতে পারবেন না, যা এআরসিকে বিভ্রান্ত করবে। স্ট্রাক্ট এবং / অথবা ইউনিয়নগুলির সাথে একটি সাধারণ প্লে গ্রন্থাগার ব্যবহার করা (সাধারণত) সম্ভব হওয়া উচিত।
voidStern

6

দেখে মনে হচ্ছে এটি এখন ত্রুটি ছাড়াই কাজ করে, সম্ভবত এই পরিবর্তনের পরে

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

$ clang --version Apple LLVM version 10.0.0 (clang-1000.11.45.2)


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