ios - উদ্দেশ্য-সি এআরসি: শক্তিশালী বনাম বজায় রাখা এবং দুর্বল বনাম বরাদ্দ
objective-c ios5 (6)
এআরসি, strong
এবং weak
দ্বারা উপস্থাপিত বৈশিষ্ট্যগুলির জন্য দুটি নতুন মেমরি পরিচালনা বৈশিষ্ট্য রয়েছে।
copy
ছাড়াও, যা স্পষ্টতই সম্পূর্ণ ভিন্ন কিছু, সেখানে strong
বনাম retain
এবং weak
বনাম assign
মধ্যে কোন পার্থক্য আছে?
আমার বোধগম্যতা থেকে, এখানে শুধুমাত্র পার্থক্য হচ্ছে weak
পয়েন্টারের জন্য nil
করা হবে, যখন assign
হবে না, যার মানে হল প্রোগ্রামটি ক্রাশ হবে যখন এটি প্রকাশ করার পরে আমি পয়েন্টারকে একটি বার্তা পাঠাতে পারি। কিন্তু যদি আমি weak
ব্যবহার করি, এটি কখনই ঘটবে না, কারণ বার্তা পাঠানো কোনও কাজ করবে না।
আমি strong
এবং retain
কোনো পার্থক্য সম্পর্কে জানি না।
আমি নতুন প্রকল্পগুলিতে assign
এবং retain
assign
কেন কোনও কারণ ব্যবহার করতে পারি নাকি সেগুলি বাতিল করা হচ্ছে?
স্ট্রং:
- সম্পত্তি ধ্বংস হবে না শুধুমাত্র একবার আপনি সম্পত্তি নিল একবার সেট বস্তু ধ্বংস করা হবে
- ডিফল্টরূপে সমস্ত ইনস্ট্যান্স ভেরিয়েবল এবং স্থানীয় ভেরিয়েবল শক্তিশালী পয়েন্টার হয়।
- আপনি বস্তুর বজায় রাখা প্রয়োজন শুধুমাত্র যদি আপনি শক্তিশালী ব্যবহার।
- আমরা সাধারণত UIViewControllers (UI আইটেম এর পিতামাতা) জন্য শক্তিশালী ব্যবহার
- আইওএস 4 (অ-এআরসি) আমরা কীওয়ার্ডকে ধরে রাখতে পারি
- আইওএস 5 (এআরসি) আমরা শক্তিশালী শব্দ ব্যবহার করতে পারেন
উদাহরণ: @ প্রোপার্টি (শক্তিশালী, অটোমোমিক) দেখুন কন্ট্রোলার * ভিউ কন্ট্রোলার;
@ সংশ্লেষ দেখুন কন্ট্রোলার;
দুর্বল
ডিফল্টরূপে স্বয়ংক্রিয়ভাবে পেতে এবং নিল সেট
- আমরা সাধারণত IBOutlets (UIViewController এর শিশু) এবং প্রতিনিধিদের জন্য দুর্বল ব্যবহার করি
- নিয়োগ হিসাবে একই জিনিস, কোন বজায় রাখা বা মুক্তি
উদাহরণ: @ প্রোপার্টি (দুর্বল, nonatomic) IBOutlet UIButton * myButton;
@ সিটিশ্চেজ মাইবটন;
nonatomic / পারমাণবিক
- nonatomic পারমাণবিক চেয়ে অনেক দ্রুত
- সর্বদা অ্যাটোমিকের জন্য খুব নির্দিষ্ট প্রয়োজন না থাকলে সর্বদা অ্যাটোমিক ব্যবহার করুন, যা বিরল হওয়া উচিত (পারমাণবিক থ্রেড নিরাপত্তা গ্যারান্টি দেয় না - শুধুমাত্র অন্য থ্রেড দ্বারা সেট করা হলে সম্পত্তিটি অ্যাক্সেস করতে স্টলগুলি)
/ strong দুর্বল / বরাদ্দ
- বস্তু বজায় রাখার জন্য শক্তিশালী ব্যবহার করুন - যদিও শব্দটি বজায় রাখা সমার্থক তবে এটি পরিবর্তে শক্তিশালী ব্যবহার করা ভাল
- যদি আপনি কেবলমাত্র বজায় রাখা ছাড়া বস্তুর একটি পয়েন্টার চান তবে দুর্বল ব্যবহার করুন - চক্র বজায় রাখা (যেমন প্রতিনিধি) এড়াতে দরকারী - অবজেক্টটি প্রকাশ করা হলে এটি স্বয়ংক্রিয়ভাবে পয়েন্টারটিকে নিঃসরণ করবে
- প্রাথমিকের জন্য বরাদ্দ ব্যবহার করুন - এটি নির্বোধের মতোই ছেড়ে দেওয়া হয় যখন এটি বস্তুটিকে বের করে দেয় না (ডিফল্ট অনুসারে সেট করুন)
(ঐচ্ছিক)
কপি
- বস্তুর একটি অগভীর কপি তৈরি করার জন্য এটি ব্যবহার করুন
- সর্বদা অননুমোদিত বৈশিষ্ট্যগুলি অনুলিপি করার জন্য ভাল অনুশীলন - কারণ পরিবর্তনযোগ্য সংস্করণগুলি অপ্রত্যক্ষ বৈশিষ্ট্যে প্রেরণ করা যেতে পারে, অনুলিপি নিশ্চিত করবে যে আপনি সর্বদা একটি অননুমোদিত বস্তুর সাথে ডিল করবেন
- যদি একটি অপরিবর্তনীয় বস্তু উত্তীর্ণ হয়, এটি এটি বজায় রাখবে - যদি একটি পরিবর্তনযোগ্য বস্তু উত্তীর্ণ হয়, এটি এটি অনুলিপি করবে
শুধুমাত্র পাঠযোগ্য
- সম্পত্তি সেটিং নিষ্ক্রিয় করতে এটি ব্যবহার করুন (কোন ইনফ্রাকশন থাকলে সংকলন থেকে কোড প্রতিরোধ করে)
- আপনি ভেতরের পরিবর্তনটি সরাসরি তার ইনস্ট্যান্স ভেরিয়েবলের মাধ্যমে বা গটার পদ্ধতিতে পরিবর্তন করে পরিবর্তনকারীর দ্বারা কী বিতরণ করেছেন তা পরিবর্তন করতে পারেন
পরিবর্তনশীল সম্পত্তি গুণাবলী চেক করার জন্য অনেকগুলি নিবন্ধ পড়ার পরে স্ট্যাকওভারফ্লো পোস্ট এবং ডেমো অ্যাপ্লিকেশনগুলি, আমি একসাথে সমস্ত গুণাবলী তথ্য দেওয়ার সিদ্ধান্ত নিয়েছি:
- পারমাণবিক // ডিফল্ট
- nonatomic
- শক্তিশালী = ডিফল্ট রাখা
- দুর্বল
- রাখা
- বরাদ্দ // ডিফল্ট
- unsafe_unretained
- কপি
- শুধুমাত্র পাঠযোগ্য
- readwrite // ডিফল্ট
নীচে বিস্তারিত নিবন্ধ লিংক যেখানে আপনি উপরে উল্লেখিত সমস্ত গুণাবলী খুঁজে পেতে পারেন, যা স্পষ্টভাবে আপনাকে সাহায্য করবে। এখানে যারা সবচেয়ে উত্তম উত্তর দেয় তাদের সবাইকে ধন্যবাদ!
1. স্ট্রং (iOS4 = বজায় রাখা)
- এটা বলছে "যতক্ষণ পর্যন্ত না আমি এটিকে নির্দেশ করব না ততক্ষণ হিপে রাখব"
- অন্য কথায়, "আমি মালিক নই, আপনি এটিকে বজায় রাখতে আগেই এটি নিরস্ত করতে পারবেন না"
- আপনি বস্তুর বজায় রাখা প্রয়োজন শুধুমাত্র যদি আপনি শক্তিশালী ব্যবহার।
- ডিফল্টরূপে সমস্ত ইনস্ট্যান্স ভেরিয়েবল এবং স্থানীয় ভেরিয়েবল শক্তিশালী পয়েন্টার হয়।
- আমরা সাধারণত UIViewControllers (UI আইটেম এর পিতামাতা) জন্য শক্তিশালী ব্যবহার
- দৃঢ়ভাবে এআরসি ব্যবহার করা হয় এবং এটি মূলত আপনাকে কোনও বস্তুর বজায় রাখার বিষয়ে চিন্তা না করেই আপনাকে সহায়তা করে। আপনি যখন এটি সম্পন্ন করেন তখন এআরসি স্বয়ংক্রিয়ভাবে এটি আপনার জন্য প্রকাশ করে। কীওয়ার্ডটি শক্তিশালী অর্থ ব্যবহার করে যে আপনি বস্তুর মালিক।
উদাহরণ:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
2. ওয়েক -
- এটি "যতক্ষণ এটি অন্য কেউ এটি দৃঢ়ভাবে নির্দেশ করে হিসাবে এই রাখা"
- নিয়োগ হিসাবে একই জিনিস, কোন বজায় রাখা বা মুক্তি
- একটি "দুর্বল" রেফারেন্সটি এমন একটি রেফারেন্স যা আপনি ধরে রাখেন না।
- আমরা সাধারণত আইবিওউলেটস (UIViewController's Childs) এর জন্য দুর্বল ব্যবহার করি। এটি কাজ করে কারণ সন্তানের বস্তু শুধুমাত্র পিতার অবজেক্টের যতক্ষণ বিদ্যমান থাকে।
- একটি দুর্বল রেফারেন্স একটি রেফারেন্স যা রেফারেন্সযুক্ত বস্তুর সংগ্রহ থেকে একটি আবর্জনা সংগ্রাহক দ্বারা সুরক্ষিত করে না।
- দুর্বল মূলত, একটি unretained সম্পত্তি বরাদ্দ করা হয়। যখন বস্তুটি হ্রাস করা হয় তখন দুর্বল পয়েন্টারটি স্বয়ংক্রিয়ভাবে নিলতে সেট হয়
উদাহরণ:
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
শক্তিশালী ও দুর্বল ব্যাখ্যা, বিজে হোমারকে ধন্যবাদ :
কল্পনা করুন আমাদের বস্তু একটি কুকুর, এবং কুকুর পালাতে চায় (বাতিল করা হবে)।
শক্তিশালী পয়েন্টার কুকুর উপর একটি শিকল মত হয়। যতক্ষণ আপনার কুকুরের সাথে শিকল থাকে, কুকুর পালিয়ে যাবে না। পাঁচজন যদি এক কুকুরকে তাদের ছিদ্রটি সংযুক্ত করে, (এক বস্তুর পাঁচটি শক্তিশালী পয়েন্টার), তখন পাঁচটি লেশস বিচ্ছিন্ন না হওয়া পর্যন্ত কুকুর পালিয়ে যাবে না।
অপরদিকে দুর্বল পয়েন্টার কুকুরের দিকে ইঙ্গিত করে ছোট বাচ্চাদের মতো এবং "দেখ! কুকুর!" যতক্ষণ কুকুর এখনও চাবুকের উপর থাকে, তবুও ছোট্ট বাচ্চারা কুকুরকে দেখতে পারে, এবং তারা এখনও এটি নির্দেশ করবে। যত তাড়াতাড়ি সব leashes পৃথক করা হয়, যদিও, কুকুর দূরে চলে যায় কতটা ছোট বাচ্চারা এটা নির্দেশ করা হয়।
যত তাড়াতাড়ি শেষ দৃঢ় পয়েন্টার (ল্যাশ) আর কোনও বস্তুর দিকে নির্দেশ করে না, বস্তুটি বাতিল করা হবে এবং সমস্ত দুর্বল পয়েন্টারগুলি শূন্য হয়ে যাবে।
আমরা দুর্বল ব্যবহার যখন?
শুধুমাত্র একবার আপনি দুর্বল ব্যবহার করতে চান, যদি আপনি চক্র বজায় রাখা এড়িয়ে চলতে চান (উদাহরণস্বরূপ বাবা-মাটি সন্তনকে ধরে রাখে এবং সন্তানের পিতামাতা ধরে রাখে যাতে কখনও মুক্তি পায় না)।
3.শক্তি = শক্তিশালী
- এটি বজায় রাখা হয়, পুরানো মানটি প্রকাশ করা হয় এবং এটি স্থির রাখা হয় নতুন মান পাঠানো উচিত তা নির্দিষ্ট করে
- বরাদ্দ রাখা এবং পুরানো মূল্য প্রেরণ করুন - দয়া করে
- বজায় রাখা শক্তিশালী হিসাবে একই।
- অ্যাপল বলছে যে আপনি যদি এটি লিখতে থাকেন তবে এটি স্বয়ংক্রিয়ভাবে রূপান্তরিত হবে / শক্তিশালী হিসাবে কাজ করবে।
- "alloc" মত পদ্ধতি একটি অন্তর্নিহিত অন্তর্ভুক্ত "বজায় রাখা"
উদাহরণ:
@property (nonatomic, retain) NSString *name;
@synthesize name;
4.assign
- বরাদ্দ ডিফল্ট এবং কেবল একটি পরিবর্তনশীল নিয়োগ সঞ্চালন করে
- বরাদ্দ একটি সম্পত্তি বৈশিষ্ট্য যা কম্পাইলারকে সম্পত্তিটির সেট্টার বাস্তবায়ন সংশ্লেষ করতে বলে
- আমি Objective-C বস্তুর দুর্বল রেফারেন্সগুলির জন্য সি আদিম বৈশিষ্ট্য এবং দুর্বল জন্য বরাদ্দ ব্যবহার করব।
উদাহরণ:
@property (nonatomic, assign) NSString *address;
@synthesize address;
যতদূর আমি জানি, strong
এবং retain
প্রতিশব্দ, তাই তারা ঠিক একই কাজ।
তারপর weak
প্রায় assign
মত, কিন্তু বস্তুর পরে স্বয়ংক্রিয়ভাবে নিল সেট করা, এটা নির্দেশ করা হয়, deallocated হয়।
এর মানে হল, আপনি কেবল তাদের প্রতিস্থাপন করতে পারেন।
যাইহোক , আমি একটি বিশেষ ক্ষেত্রে সম্মুখীন হয়েছে, যেখানে আমি weak
তুলনায় assign
ব্যবহার করা ছিল। আসুন আমরা দুটি বৈশিষ্ট্য delegateAssign
এবং delegateWeak
। উভয়ই আমাদের প্রতিনিধিকে সঞ্চিত করে, যা কেবলমাত্র দৃঢ় রেফারেন্স থাকার দ্বারা আমাদের মালিক। প্রতিনিধির -dealloc
, তাই -dealloc
পদ্ধতি খুব বলা হয়।
// Our delegate is deallocating and there is no other strong ref.
- (void)dealloc {
[delegateWeak doSomething];
[delegateAssign doSomething];
}
প্রতিনিধি ইতিমধ্যে deallocation প্রক্রিয়া, কিন্তু এখনও সম্পূর্ণরূপে নির্বাসন হয় না। সমস্যা হচ্ছে তার weak
রেফারেন্স ইতিমধ্যেই বাতিল! সম্পত্তি delegateWeak
উইক nil অন্তর্ভুক্ত, কিন্তু 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
ভেরিয়েবলগুলি কীভাবে কাজ করে এবং যখন এটি বাতিল করা হয় তখন তা প্রকাশ করে।
উদ্দেশ্য-সি স্বয়ংক্রিয় রেফারেন্স কাউন্টিং (এআরসি) -এ ক্ল্যাং এর দস্তাবেজ মালিকানা যোগ্যতা এবং সংশোধনকারীদের স্পষ্টভাবে ব্যাখ্যা করে:
চার মালিকানা কোয়ালিফায়ার আছে:
- __ autoreleasing
- __ শক্তিশালী
- __ * unsafe_unretained *
- __ দুর্বল
__ autoreleasing , __ দৃঢ় , অথবা __ দুর্বলের সাথে যোগ্য হলে এটি একটি স্বতঃস্ফূর্ত মালিকানা-যোগ্যতা।
তারপরে ঘোষিত সম্পত্তির জন্য ছয় মালিকানা সংশোধনকারী আছে:
- বরাদ্দ __ * unsafe_unretained * মালিকানা নির্ধারণ ।
- অনুলিপি __ দৃঢ় মালিকানা, সেইসাথে সেটার উপর অনুলিপি semantics স্বাভাবিক আচরণ বোঝায়।
- __ দৃঢ় মালিকানা বোঝায় রাখা ।
- শক্তিশালী __ শক্তিশালী মালিকানা বোঝায়।
- * unsafe_unretained * বোঝায় __ * unsafe_unretained * মালিকানা।
- দুর্বল বোঝা __ দুর্বল মালিকানা।
দুর্বল ব্যতিক্রম ছাড়া, এই সংশোধনকারীরা অ-এআরসি মোডগুলিতে উপলব্ধ।
সেমেন্টিক অনুযায়ী, মালিকানার যোগ্যতা অর্জনকারী পাঁচটি পরিচালিত ক্রিয়াকলাপগুলিতে বিভিন্ন অর্থ রয়েছে: পঠন, বরাদ্দকরণ, প্রাথমিকীকরণ, ধ্বংস এবং মুভিং, যা বেশিরভাগ ক্ষেত্রেই আমরা কেবল অ্যাসাইনমেন্ট অপারেশনয়ের পার্থক্য সম্পর্কেই যত্নশীল।
অ্যাসাইনমেন্ট অপারেটর মূল্যায়ন করার সময় ঘটে। পদার্থবিদ্যা যোগ্যতা উপর ভিত্তি করে পরিবর্তিত হয়:
- __ শক্তিশালী বস্তুগুলির জন্য, নতুন পয়েন্টটি প্রথম বজায় রাখা হয়; দ্বিতীয়, lvalue আদিম semantics সঙ্গে লোড করা হয়; তৃতীয়, নতুন পয়েন্টটি আদিম শব্দকোষের সাথে লভ্যে সংরক্ষিত হয়; এবং অবশেষে, পুরাতন পয়েন্টার মুক্তি হয়। এটি পারমাণবিকভাবে সঞ্চালিত হয় না; বহিরাগত সিঙ্ক্রোনাইজেশানটি সমান্তরাল লোড এবং স্টোরগুলির মুখে এই নিরাপদ করতে ব্যবহার করতে হবে।
- __ দুর্বল বস্তুর জন্য, লভ্যটি নতুন পয়েন্টে নির্দেশ করার জন্য হালনাগাদ করা হয়, যদি না নতুন পয়েন্টটি বর্তমানে অবলুপ্তির মধ্যবর্তী একটি বস্তু হয়, তবে কোন ক্ষেত্রে নমনীয় পয়েন্টারকে হালকাভাবে আপডেট করা হয়। এই বস্তুর অন্য কার্যকারিতা, বস্তু থেকে পড়া এবং নতুন পয়েন্টারের চূড়ান্ত প্রকাশের সাথে সম্পর্কিত পারমাণবিকভাবে কার্যকর করতে হবে।
- __ * unsafe_unretained * বস্তুগুলির জন্য, নতুন পয়েন্টটি আদিম শব্দকৌশল ব্যবহার করে লভ্যে সংরক্ষণ করা হয়।
- __ অটোরলাইজিং বস্তুগুলির জন্য, নতুন পয়েন্টটি অপরিবর্তিত, অটোরিকৃত, এবং আদিম শব্দকৌশল ব্যবহার করে লভ্যে সংরক্ষণ করা হয়।
পঠন, ইনিট, ধ্বংস এবং মুভিংয়ের অন্য পার্থক্যটি দয়া করে নথির বিভাগ 4.2 সেমেন্টিক্স পড়ুন।
ট্রানজিশনিং থেকে এআরসি রিলিজ নোট (সম্পত্তি বৈশিষ্ট্য বিভাগে উদাহরণ) থেকে।
// The following declaration is a synonym for: @property(retain) MyClass *myObject;
@property(strong) MyClass *myObject;
তাই সম্পত্তি একটি ঘোষণা ঘোষণা retain
হিসাবে একই strong
।
এআরসি প্রকল্পের জন্য আমি retain
পরিবর্তে strong
ব্যবহার করব, আমি সি আদিম বৈশিষ্ট্যের জন্য assign
ব্যবহার করব এবং উদ্দেশ্য-সি বস্তুর দুর্বল রেফারেন্সগুলির জন্য দুর্বল।