উদ্দেশ্য-সি আরসি: শক্তিশালী বনাম বজায় রাখা এবং দুর্বল বনাম বরাদ্দ


367

এআরসি দ্বারা প্রবর্তিত সম্পত্তিগুলির জন্য দুটি নতুন মেমরি পরিচালনা বৈশিষ্ট্য রয়েছে strongএবং weak

এগুলি ছাড়াও copyযা স্পষ্টতই সম্পূর্ণ ভিন্ন কিছু, বনাম এবং বনামের মধ্যে কোনও পার্থক্য রয়েছে ?strongretainweakassign

আমার বোধগম্যতা থেকে, কেবল এখানে পার্থক্য হ'ল এটি পয়েন্টারকে weakবরাদ্দ করবে nil, যখন assignহবে না, যার অর্থ প্রোগ্রামটি ক্র্যাশ হয়ে যাবে যখন আমি পয়েন্টারে একটি বার্তা প্রকাশ করি এটি প্রকাশ হওয়ার পরে। তবে আমি যদি ব্যবহার করি তবে weakএটি কখনই ঘটবে না, কারণ বার্তা প্রেরণে nilকিছু হবে না।

আমি strongএবং এর মধ্যে কোনও পার্থক্য সম্পর্কে জানি না retain

সেখানে কোন কারণে আমি ব্যবহার কেন করা উচিত যে assignএবং retainনতুন প্রকল্পের, বা থামানোর জন্য ধরনের হয়?


12
সেখানে এআরসি চালু বৈশিষ্ট্যের জন্য তিনটি নতুন মেমরি ব্যবস্থাপনা বৈশিষ্ট্যাবলী হয় strong, weakএবং unsafe_unretained
এনজোনস

5
@NJones আছে দুই সম্পত্তি বৈশিষ্ট্যাবলী ( weakএবং strong) এবং 4 পরিবর্তনশীল জীবনকাল কোয়ালিফায়ার ( __strong, __weak, __unsafe_unretained, __autoreleasing)। নীচে এআরসি নোটগুলি দেখুন।
স্নো ক্র্যাশ

1
@ স্নো ক্র্যাশ এখানে এক্সকোডের একটি সংস্করণ ছিল, সম্ভবত একটি বিকাশকারী পূর্বরূপ, যার assignসাথে এটিআরসি সংকলন করার সময় ব্যবহার করা ছিল একটি ত্রুটি। এটি সম্পর্কে অনেকগুলি মুছে ফেলা উত্তর রয়েছে। চূড়ান্ত মুক্তির আগেই এটি পরিবর্তন করা হয়েছিল বলে মনে হয়। unsafe_unretainedআমাদের অনেক প্রাথমিক গ্রহণকারীদের পক্ষে পছন্দের বৈশিষ্ট্য। প্রমাণের জন্য এটি unsafe_unretainedঅ্যাপলের "প্রোগ্রামিং উইথ অবজেক্টিভ-সি" এর শিরোনাম "এনক্যাপসুলেটিং ডেটা" বিভাগের অধীনে "কিছু শ্রেণীর জন্য অনিরাপদ অপ্রকাশিত রেফারেন্সগুলি ব্যবহার করুন" বিভাগের অধীনে একটি বৈধ বৈশিষ্ট্যযুক্ত চেহারা। যা বলে: "একটি সম্পত্তির জন্য, এর অর্থ অনিরাপদ_রক্ষিত বৈশিষ্ট্যটি ব্যবহার করা হচ্ছে:"
এনজোনস

উত্তর:


230

থেকে এআরসি রিলিজ নোট রূপান্তরের (সম্পত্তি বৈশিষ্ট্যাবলী বিভাগে উদাহরণ)।

// The following declaration is a synonym for: @property(retain) MyClass *myObject;

@property(strong) MyClass *myObject;

সুতরাং strongহিসাবে একই retainএকটি সম্পত্তি ঘোষণায়।

এআরসি প্রকল্পগুলির strongপরিবর্তে আমি এর পরিবর্তে ব্যবহার করব retain, আমি assignসি আদিম বৈশিষ্ট্যগুলির weakজন্য এবং উদ্দেশ্য-সি বস্তুর দুর্বল উল্লেখগুলির জন্য ব্যবহার করব।


11
আসলে, এআরসি এর অধীনে এটি কোনও সামগ্রীর জন্য ব্যবহার করা একটি সংকলন ত্রুটি assign। আপনি সম্পত্তিটি ধরে রাখতে না চাইলে আপনাকে ( weakবা unsafe_unretainedযা নিরাপদ, অবশ্যই) ব্যবহার করতে হবে।
কোব্বল

5
assignস্থাপনার লক্ষ্যমাত্রা ৪.০ সহ এআরসি প্রকল্পগুলিতে আমার জন্য ঠিক জরিমানা সংকলন করে।
পাসকাল

8
@ পাসল: ওএস 5.0 বা তার চেয়ে বেশি নয় এমন মোতায়েনের লক্ষ্যগুলিতে দুর্বল উল্লেখগুলি অনুমোদিত নয়। সুতরাং পুরানো প্রকল্পগুলির জন্য আপনি এখনও অ্যাসাইন ব্যবহার করতে পারেন, তবে আপনি যদি নতুন সংস্করণে চলে যান তবে আপনাকে দুর্বল হয়ে যেতে হবে
ম্যাটিয়া

1
দেখে মনে হচ্ছে এক্সকোড 4 (এআরসি সহ) বনাম । ব্যবহার করে এনএসম্যানেজডঅবজেক্ট সাবক্লাস তৈরি করে । আমি মনে করি এটি বেশিরভাগই ক্ষতিকারক নয়, তবে আমি ধারণা করি এটি ধারাবাহিকতার জন্য হওয়া উচিত ... বা সম্ভবত এটি কোনও ব্যাপার নয়। stackoverflow.com/questions/7796476/…retainstrongstrong
জো

3
@ জেরেমিপ হ্যাঁ, আপনার উত্তর স্পট-অন রয়েছে। আমি @ মাতিয়াতে প্রতিক্রিয়া জানছিলাম। আমি উল্লেখ করছিলাম যে assignএখনও কিছু ক্ষেত্রে বৈধ।
স্টিভন অক্সলে

606

পরিবর্তনশীল সম্পত্তির বৈশিষ্ট্যগুলি পরীক্ষা করতে স্ট্যাকওভারফ্লো পোস্ট এবং ডেমো অ্যাপ্লিকেশনগুলি এতগুলি নিবন্ধ পড়ার পরে, আমি সমস্ত বৈশিষ্ট্যের তথ্য একসাথে রাখার সিদ্ধান্ত নিয়েছি:

  1. পারমাণবিক // ডিফল্ট
  2. nonatomic
  3. strong = برقرار // ডিফল্ট
  4. দুর্বল
  5. রাখা
  6. নির্ধারিত // ডিফল্ট
  7. unsafe_unretained
  8. কপি
  9. শুধুমাত্র পাঠযোগ্য
  10. পঠন রচনা // ডিফল্ট

নীচে বিশদ নিবন্ধের লিঙ্কটি যেখানে আপনি উপরে উল্লিখিত সমস্ত বৈশিষ্ট্যগুলি পেতে পারেন, এটি অবশ্যই আপনাকে সহায়তা করবে। যারা এখানে সেরা উত্তর দেয় তাদের সকলকে অনেক ধন্যবাদ !!

আইওএসে পরিবর্তনশীল সম্পত্তি বৈশিষ্ট্য বা সংশোধক

1. স্ট্রং (আইওএস 4 = ধরে রাখা)

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

উদাহরণ:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;

২.উয়াক -

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

উদাহরণ:

@property (weak, nonatomic) IBOutlet UIButton *myButton;

@synthesize myButton;

শক্তিশালী ও দুর্বল ব্যাখ্যা, বিজে হোমারকে ধন্যবাদ :

কল্পনা করুন যে আমাদের অবজেক্টটি একটি কুকুর, এবং কুকুরটি পালাতে চায় (বিচ্ছিন্ন হোক)।

শক্তিশালী পয়েন্টারগুলি কুকুরের উপর ছোঁড়ার মতো। যতক্ষণ না আপনি কুকুরটির সাথে জোঁক জড়ান, ততক্ষণ কুকুর পালাতে পারবে না। যদি পাঁচ জন তাদের কুকুরটিকে একটি কুকুরের সাথে সংযুক্ত করে, (একটি বস্তুর কাছে পাঁচটি দৃ poin় পয়েন্টার), তবে পাঁচটি ল্যাশ পৃথক না করা অবধি কুকুরটি পালাতে পারবে না।

অন্যদিকে দুর্বল পয়েন্টারগুলি হ'ল ছোট বাচ্চাদের মতো কুকুরটির দিকে ইশারা করে এবং বলে "দেখো! একটি কুকুর!" কুকুরটি যতক্ষণ না পীড়িত থাকে ততক্ষণ ছোট বাচ্চারা কুকুরটিকে দেখতে পাবে এবং তারা এখনও এটি দেখিয়ে দেবে। যত তাড়াতাড়ি সমস্ত leashes বিচ্ছিন্ন করা হয়, যদিও, কুকুর যতটা ছোট বাচ্চা এর দিকে ইশারা করছে তা পালিয়ে যায়।

যত তাড়াতাড়ি শেষ শক্তিশালী পয়েন্টার (ছোঁয়া) কোনও বস্তুর দিকে নির্দেশ না করে, অবজেক্টটি বাতিল হয়ে যাবে এবং সমস্ত দুর্বল পয়েন্টার শূন্য হয়ে যাবে।

আমরা কখন দুর্বল ব্যবহার করব?

কেবলমাত্র আপনি দুর্বল ব্যবহার করতে চান, যদি আপনি ধরে রাখার চক্র এড়াতে চেয়েছিলেন (যেমন, পিতা-মাতা সন্তানকে ধরে রাখে এবং শিশু পিতামাতাকে ধরে রাখে তাই কখনও মুক্তি হয় না)।

৩.প্রশ্ন = শক্ত

  • এটি ধরে রাখা হয়, পুরানো মান প্রকাশিত হয় এবং এটি পুনরুদ্ধার করা হয় যা নতুন মান প্রেরণ করা উচিত তা নির্দিষ্ট করে
  • অ্যাসাইনমেন্ট ধরে রাখুন এবং পুরানো মান প্রেরণ করা হয়েছে - দয়া করে
  • ধরে রাখা শক্ত হিসাবে একই।
  • আপেল বলে আপনি যদি ধরে রাখেন তবে এটি স্বয়ংক্রিয়ভাবে রূপান্তরিত / কেবল শক্তির মতো কাজ করবে।
  • "বরাদ্দ" এর মতো পদ্ধতিতে অন্তর্ভুক্ত "রক্ষণাবেক্ষণ" অন্তর্ভুক্ত

উদাহরণ:

@property (nonatomic, retain) NSString *name;

@synthesize name;

4.assign

  • এসাইন্টটি ডিফল্ট এবং কেবল একটি ভেরিয়েবল অ্যাসাইনমেন্ট সম্পাদন করে
  • বরাদ্দ করা একটি সম্পত্তি বৈশিষ্ট্য যা সম্পত্তির সেটার বাস্তবায়ন সংশ্লেষিত করতে সংকলককে বলে to
  • আমি সি আদিম সম্পত্তিগুলির জন্য বরাদ্দ এবং উদ্দেশ্য-সি অবজেক্টগুলির দুর্বল উল্লেখগুলির জন্য দুর্বল ব্যবহার করব।

উদাহরণ:

@property (nonatomic, assign) NSString *address;

@synthesize address;

5
২. "একটি দুর্বল রেফারেন্স হ'ল একটি রেফারেন্স যা কোনও আবর্জনা সংগ্রহকারী দ্বারা রেফারেন্সযুক্ত বস্তুকে সংগ্রহ থেকে রক্ষা করে না" - অবজেক্টিভ সিতে আবর্জনা সংগ্রাহকের মতো কোনও জিনিস নেই;
বুচারল্যান্ড

1
এবং এই শ্রেণিবিন্যাসটি স্বয়ংক্রিয়ভাবে আইওএস দ্বারা পরিচালিত হয়। এমভিসি ধারণা সম্পর্কে পড়ুন। আমি বলতে চাইছি যখন ভিউকন্ট্রোলার আইওএস উপস্থাপন করা হচ্ছে তখন স্ক্রিনে এটির ভিউয়ের স্তরটি লোড হয় (নিখোঁজ দর্শন তৈরি করা)। অন্যান্য ভিউকন্ট্রোলার উপস্থাপন করা হয়, এই মতামত এই প্রথম শ্রেণিবিন্যাস deallocated হয়। তবে যদি ভিউকন্ট্রোলারে আপনার 'শক্তিশালী' থাকে, তখন স্ক্রিনটি বন্ধ হয়ে গেলে এই ভিউটি dellocated করা যাবে না। যা ডিভাইস মেমরির এবং অ্যাপ্লিকেশনকে মন্থর হওয়ার কারণে শক্ত প্রভাব ফেলতে পারে। (অবশ্যই ডিভাইসের প্রচুর স্মৃতি রয়েছে এবং আপনি অবশ্যই 5-10 স্ক্রিন অ্যাপ্লিকেশনটিতে ভাল থাকবেন তবে বিশাল অ্যাপটিতে আপনি সমস্যায়
পড়বেন

1
আমরা কখন দুর্বল ব্যবহার করব? ১. ইউআই অবজেক্টের জন্য, ২. প্রতিনিধি, ৩. ব্লক (স্মৃতিচক্র এড়াতে নিজের পরিবর্তে দুর্বল সেলফ ব্যবহার করা উচিত (উপরে উল্লিখিত হিসাবে)
বুখারল্যান্ড

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

1
@ আরডিসি, এর defaultঅর্থ কী? আমি যদি @property (nonatomic) NSString *stringএটি ব্যবহার করি strong? নাকি assign? কারণ উভয়ই খেলাপি।
Iulian Onofrei

40

nonatomic / পারমাণবিক

  • পারমাণবিক চেয়ে ননোটমিক অনেক দ্রুত is
  • অণুবিদ্যার জন্য আপনার খুব নির্দিষ্ট প্রয়োজনীয়তা না থাকলে সর্বদা ননোটমিক ব্যবহার করুন, যা বিরল হওয়া উচিত (পারমাণবিক থ্রেড সুরক্ষার গ্যারান্টি দেয় না - যখন সম্পত্তি একসাথে অন্য থ্রেড দ্বারা সেট করা হয় তখন কেবল স্টল অ্যাক্সেস করে)

/ strong দুর্বল / বরাদ্দ

  • অবজেক্টগুলি ধরে রাখতে শক্তিশালী ব্যবহার করুন - যদিও কীওয়ার্ডটি ধরে রাখা সমার্থক হলেও এর পরিবর্তে শক্তিশালী ব্যবহার করা ভাল
  • দুর্বল ব্যবহার করুন যদি আপনি কেবল বস্তুটি ধরে না রেখেই পয়েন্টার চান - ধরে রাখার চক্র এড়াতে কার্যকর (যেমন, প্রতিনিধি) - অবজেক্টটি প্রকাশিত হলে এটি স্বয়ংক্রিয়ভাবে পয়েন্টারটি সরিয়ে ফেলবে
  • ব্যবহার বরাদ্দ primatives জন্য - ঠিক দুর্বল মত ছাড়া এটি বস্তুর শূন্য না যখন (ডিফল্ট দ্বারা সেট) প্রকাশিত

(ঐচ্ছিক)

কপি

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

শুধুমাত্র পাঠযোগ্য

  • সম্পত্তির সেটিংটি অক্ষম করতে এটি ব্যবহার করুন (কোনও বিভ্রান্তি থাকলে সংকলন থেকে কোড রোধ করে)
  • আপনি গেটর দ্বারা সরবরাহিত ডিভাইসটি পরিবর্তিত করতে পারেন হয় হয় তার ভেরিয়েবলের মাধ্যমে সরাসরি তার ভেরিয়েবলের মাধ্যমে পরিবর্তন করতে পারেন, বা নিজেই গিটার পদ্ধতির মধ্যে থাকতে পারেন

@ সত্যিমুথিয়াহ ঠিক বলেছেন, আপনার উত্তরটি সংশোধন করতে হবে।
অ্যাডেলা টোডেরিসি

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

39

যতদূর আমি জানি, strongএবং retainপ্রতিশব্দগুলি, তাই তারা ঠিক একই কাজ করে।

তারপরে weakপ্রায় assignএটির মতো , তবে বস্তুর পরে স্বয়ংক্রিয়ভাবে নির্ধারণ করা হবে, এটি নির্দেশ করছে, অবনমিত হয়।

এর অর্থ, আপনি কেবল এগুলি প্রতিস্থাপন করতে পারেন।

যাইহোক , একটি বিশেষ ক্ষেত্রে আমি মুখোমুখি হয়েছি, যেখানে আমাকে ব্যবহার assignনা করেই করতে হয়েছিল weak। ধরা যাক আমাদের দুটি বৈশিষ্ট্য আছে delegateAssignএবং delegateWeak। উভয়ই আমাদের প্রতিনিধি সংরক্ষণ করা হয়, যে একমাত্র দৃ strong় রেফারেন্স থাকার দ্বারা আমাদের মালিকানা হয়। প্রতিনিধি হ্রাস করা হয়, তাই আমাদের -deallocপদ্ধতিও বলা হয়।

// Our delegate is deallocating and there is no other strong ref.
- (void)dealloc {
    [delegateWeak doSomething];
    [delegateAssign doSomething];
}

প্রতিনিধি ইতিমধ্যে নির্গমন প্রক্রিয়াধীন, তবে এখনও সম্পূর্ণরূপে অবনমিত হয়নি। সমস্যাটি হচ্ছে weakতাঁর উল্লেখগুলি ইতিমধ্যে বাতিল করা হয়েছে! সম্পত্তিতে delegateWeakশূন্য থাকে তবে delegateAssignএতে বৈধ অবজেক্ট থাকে (ইতিমধ্যে প্রকাশিত এবং বাতিল হওয়া সমস্ত সম্পত্তি সহ) তবে এখনও বৈধ।

// Our delegate is deallocating and there is no other strong ref.
- (void)dealloc {
    [delegateWeak doSomething]; // Does nothing, already nil.
    [delegateAssign doSomething]; // Successful call.
}

এটি বেশ বিশেষ ক্ষেত্রে তবে এটি আমাদের প্রকাশ করে যে কীভাবে সেই weakপরিবর্তনশীলগুলি কাজ করে এবং কখন সেগুলি বাতিল করা হয়।



20

অবজেক্টিভ-সি স্বয়ংক্রিয় রেফারেন্স কাউন্টিং (এআরসি) সম্পর্কিত ক্ল্যাংয়ের নথি মালিকানার যোগ্যতা এবং সংশোধককে স্পষ্টভাবে ব্যাখ্যা করে:

চারটি মালিকানার যোগ্যতা রয়েছে:

  • __ অটোরেলিজিং
  • __ শক্তিশালী
  • __ * unsafe_unretained *
  • __ দুর্বল

এক ধরন nontrivially মালিকানা-যোগ্যতাসম্পন্ন যদি এটা __ সঙ্গে যোগ্যতাসম্পন্ন হয় autoreleasing , __ শক্তিশালী , অথবা __ দুর্বল

তারপরে ঘোষিত সম্পত্তির জন্য ছয়টি মালিকানা পরিবর্তক রয়েছে:

  • অর্পণ করে __ * অনিরাপদ_অনেকৃত * মালিকানা।
  • অনুলিপি __ শক্তিশালী মালিকানা বোঝায় , পাশাপাশি সেটারে অনুলিপি শব্দকোষের স্বাভাবিক আচরণ।
  • ধরে রাখা বোঝায় __ শক্ত মালিকানা।
  • strong বোঝায় __ শক্ত মালিকানা।
  • * অনিরাপদ_ অরক্ষিত * এর অর্থ __ * অনিরাপদ_অনেকৃত * মালিকানা।
  • দুর্বল বোঝায় __ দুর্বল মালিকানা।

ব্যতীত দুর্বল , এই সংশোধনকারীদের অ এআরসি মোড পাওয়া যায়।

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

অ্যাসাইনমেন্ট অপারেটরকে মূল্যায়ন করার সময় অ্যাসাইনমেন্ট হয়। যোগ্যতার ভিত্তিতে শব্দার্থবিজ্ঞানগুলি পৃথক:

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

পড়া, ইনিশ, ধ্বংস এবং চলাফেরার অন্যান্য পার্থক্য, দয়া করে নথিতে বিভাগ 4.2 শব্দার্থবিজ্ঞান দেখুন


6

শক্তিশালী এবং দুর্বল রেফারেন্সটি বুঝতে নীচের উদাহরণটি বিবেচনা করুন, ধরুন আমাদের কাছে এমন পদ্ধতি রয়েছে যা ডিসপ্লেলোকরিয়ালি হিসাবে পরিচিত।

 -(void)displayLocalVariable
  {
     NSString myName = @"ABC";
     NSLog(@"My name is = %@", myName);
  }

উপরের মেথডে মাইনেম ভেরিয়েবলের স্কোপটি ডিসপ্লেলোকরিয়াল পদ্ধতিতে সীমাবদ্ধ, একবার পদ্ধতিটি শেষ হয়ে গেলে মাইনেম ভেরিয়েবল যা "এবিসি" স্ট্রিং ধারণ করে তা মেমরি থেকে বিচ্ছিন্ন হয়ে যাবে।

এখন যদি আমরা আমাদের ভিউ কন্ট্রোলার লাইফ চক্র জুড়ে মাইনেম ভেরিয়েবল মান ধরে রাখতে চাই। এর জন্য আমরা ব্যবহারকারীর নাম হিসাবে সম্পত্তিটি তৈরি করতে পারি যা ভেরিয়েবলের MyName ( self.username = myName;নীচের কোডে দেখুন) এর উপর দৃ St় উল্লেখ থাকবে , নীচের মত,

@interface LoginViewController ()

@property(nonatomic,strong) NSString* username;
@property(nonatomic,weak) NSString* dummyName;

- (void)displayLocalVariable;

@end

@implementation LoginViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

}

-(void)viewWillAppear:(BOOL)animated
{
     [self displayLocalVariable];
}

- (void)displayLocalVariable
{
   NSString myName = @"ABC";
   NSLog(@"My name is = %@", myName);
   self.username = myName;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}


@end

এখন উপরের কোডে আপনি দেখতে পাচ্ছেন যে মাইনেমকে সেলফ.উজারনেম অর্পণ করা হয়েছে এবং সেলফ.উজারনেমটির মাইনেমে একটি শক্তিশালী রেফারেন্স রয়েছে (যেমন আমরা @property ব্যবহার করে ইন্টারফেসে ঘোষণা করেছি) (অপ্রত্যক্ষভাবে এটি "ABC" স্ট্রিংয়ের দৃ reference় উল্লেখ রয়েছে) having অতএব স্ট্রিং মাইনাম মেমরি থেকে স্ব-ব্যবহারকারীর নাম জীবন্ত না হওয়া পর্যন্ত বিচ্ছিন্ন হবে না।

  • দুর্বল রেফারেন্স

এখন মাইনেমকে ডামিনেমকে অ্যাসাইন করা বিবেচনা করুন যা একটি দুর্বল রেফারেন্স, self.dummyName = myName; শক্তিশালী রেফারেন্সের বিপরীতে দুর্বল কেবলমাত্র আমার নামটি ধরে রাখবেন যতক্ষণ না মাইনেমের প্রতি দৃ reference় উল্লেখ রয়েছে। দুর্বল রেফারেন্স বুঝতে নীচের কোডটি দেখুন,

-(void)displayLocalVariable
  {
     NSString myName = @"ABC";
     NSLog(@"My name is = %@", myName);
     self.dummyName = myName;
  }

উপরের কোডে মাইনেমের প্রতি দুর্বল রেফারেন্স রয়েছে (অর্থাত্ স্ব। ডামিনেমে মাইনেমের প্রতি দুর্বল রেফারেন্স রয়েছে) তবে মাইনেমের কোনও শক্ত রেফারেন্স নেই, সুতরাং স্ব.ডমি নামটি মাইনেম মান ধরে রাখতে সক্ষম হবে না।

এখন আবার নীচের কোডটি বিবেচনা করুন,

-(void)displayLocalVariable
      {
         NSString myName = @"ABC";
         NSLog(@"My name is = %@", myName);
         self.username = myName;
         self.dummyName = myName;
      } 

উপরের কোডে স্ব.ইউজারনেম মাইনেমের সাথে একটি শক্তিশালী রেফারেন্স রয়েছে, সুতরাং মাইনেমের সাথে একটি স্ট্রং রেফারেন্স যুক্ত হওয়ার পরেও পদ্ধতিটি শেষ হওয়ার পরেও স্ব.ডামিনামে এখন মাইনেমের একটি মান থাকবে।

এখন যখনই আমরা কোনও ভেরিয়েবলের জন্য শক্তিশালী রেফারেন্স করি তখন এটি ধরে রাখার গণনা একের সাথে বাড়তে থাকে এবং ভেরিয়েবলটি বিচ্ছিন্ন রক্ষণযোগ্য গণনা 0 এ পৌঁছায় না।

আশাকরি এটা সাহায্য করবে.


2

স্ট্রং:

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

উদাহরণ: @ প্রপার্টি (শক্তিশালী, ননোটমিক) ভিউকন্ট্রোলার * ভিউকন্ট্রোলার;

@ সেন্টসাইজ ভিউ কন্ট্রোলার;

দুর্বল

ডিফল্ট দ্বারা স্বয়ংক্রিয়ভাবে পান এবং শূন্য করতে সেট

  • আমরা সাধারণত আইবিআউটলেটগুলি (ইউআইভিউকন্ট্রোলার চাইল্ডস) এবং প্রতিনিধিদের জন্য দুর্বল ব্যবহার করি
  • নির্ধারিত হিসাবে একই জিনিস, না ধরে রাখা বা মুক্তি

উদাহরণ: @ প্রপার্টি (দুর্বল, ননোটমিক) আইবিউটলেট ইউআইবাটন * মাইবাটন;

@ সায়েন্টেসাইজ মাই বাটন;


1

শক্তিশালী এবং ধরে রাখার মধ্যে পার্থক্য:

  • আইওএস 4-তে, শক্তিশালী ধরে রাখা সমান
  • এর অর্থ হল যে আপনি অবজেক্টটির মালিক এবং এটির দিকে ইশারা না করা পর্যন্ত এটিকে স্তূপে রেখে দিন
  • আপনি যদি ধরে রাখেন এটি স্বয়ংক্রিয়ভাবে ঠিক শক্তির মতো কাজ করবে

দুর্বল এবং নির্ধারিত মধ্যে পার্থক্য:

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