আমাদের কি করতে atomicএবং nonatomicসম্পত্তি ঘোষণা অর্থ?
@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;
এই তিনটির মধ্যে অপারেশনাল পার্থক্য কী?
আমাদের কি করতে atomicএবং nonatomicসম্পত্তি ঘোষণা অর্থ?
@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;
এই তিনটির মধ্যে অপারেশনাল পার্থক্য কী?
উত্তর:
শেষ দুটি একই; "পারমাণবিক" হ'ল ডিফল্ট আচরণ ( নোট করুন যে এটি আসলে কোনও মূলশব্দ নয়; এটি কেবলমাত্র অনুপস্থিতির দ্বারা নির্দিষ্টnonatomicatomic করা হয়েছে - llvm / clang এর সাম্প্রতিক সংস্করণগুলিতে কীওয়ার্ড হিসাবে যুক্ত হয়েছিল)।
ধরে নিচ্ছেন যে আপনি পদ্ধতিটি বাস্তবায়নের জন্য @ সংশ্লেষ করছেন, পরমাণু বনাম অ-পরমাণু উত্পন্ন কোড পরিবর্তন করে। আপনি যদি নিজের নিজস্ব সেটার / গেটারগুলি লিখছেন তবে পারমাণবিক / নন্যাটমিক / রক্ষণ / নির্ধারণ / অনুলিপি কেবল পরামর্শমূলক। (দ্রষ্টব্য: @synthesize এখন LLVM এর সাম্প্রতিক সংস্করণে ডিফল্ট আচরণ এছাড়া ঘোষণা উদাহরণস্বরূপ ভেরিয়েবল করার কোন প্রয়োজন নেই; তারা স্বয়ংক্রিয়ভাবে খুব সংশ্লেষিত করা হবে, এবং একটি থাকবে। _তাদের নাম আপতিক সরাসরি প্রবেশ রোধ করার আগে লেখা)।
"পারমাণবিক" দিয়ে, সংশ্লেষিত সেটার / গেটার নিশ্চিত করবে যে কোনও অন্যান্য থ্রেডে সেটার ক্রিয়াকলাপ নির্বিশেষে পুরো মান সর্বদা গেটর থেকে ফিরে আসে বা সেটার দ্বারা সেট করা হয়। এটি হ'ল, থ্রেড এ যদি গ্রাহকের মাঝখানে থাকে এবং থ্রেড বি সেটটারটিকে কল করে, একটি আসল কার্যকর মূল্য - একটি স্বতঃসংশ্লিষ্ট বস্তু, সম্ভবত - এটি এ-তে কলারে ফিরে আসবে will
ইন nonatomic, যেমন কোন গ্যারান্টি দেওয়া হয়। সুতরাং, nonatomic"পারমাণবিক" এর তুলনায় যথেষ্ট দ্রুত।
"পারমাণবিক" যা করে না তা হ'ল থ্রেড সুরক্ষা সম্পর্কে কোনও গ্যারান্টি দেওয়া। থ্রেড এ যদি থ্রেড বি এবং সি এর সাথে একই সাথে বিভিন্ন মান সহ সেটারকে কল করে, থ্রেড এ তিনটি মানের যে কোনও একটি ফেরত পেতে পারে - যে কোনও সেটারের আগে ডাকা হয় বা সেটারে যে মানগুলি হয় সেগুলির মধ্যে একটি বি এবং সি একইভাবে, অবজেক্টটি বি বা সি এর মান দিয়ে শেষ হতে পারে, বলার উপায় নেই।
ডেটা অখণ্ডতা নিশ্চিতকরণ - মাল্টি-থ্রেড প্রোগ্রামিংয়ের অন্যতম প্রাথমিক চ্যালেঞ্জ - অন্য উপায়ে অর্জন করা হয়েছে।
এটি যুক্ত করা হচ্ছে:
atomicity একাধিক নির্ভরশীল সম্পত্তি খেলতে থাকলে কোনও একক সম্পত্তিও থ্রেড সুরক্ষার গ্যারান্টি দিতে পারে না।
বিবেচনা:
@property(atomic, copy) NSString *firstName;
@property(atomic, copy) NSString *lastName;
@property(readonly, atomic, copy) NSString *fullName;
এই ক্ষেত্রে থ্রেড এ বস্তুর নাম পরিবর্তন করে কল করে setFirstName:এবং তারপরে কল করে setLastName:। ইতিমধ্যে থ্রেড বি fullNameথ্রেড এ এর দুটি কলের মধ্যে কল করতে পারে এবং পুরানো শেষ নামের সাথে নতুন প্রথম নামটি গ্রহণ করবে।
এটির সমাধানের জন্য আপনার একটি লেনদেনের মডেল দরকার । অর্থাত্ কিছু অন্যান্য সমন্বয় এবং / অথবা বর্জন যা fullNameনির্ভরযোগ্য বৈশিষ্ট্যগুলি আপডেট করা হচ্ছে সে সময় অ্যাক্সেস বাদ দিতে দেয় ।
@property NSArray* astronomicalEvents;যা আমি ইউআইতে প্রদর্শন করতে চান এমন ডেটা তালিকাভুক্ত করে। অ্যাপ্লিকেশনটি যখন খালি অ্যারেটিতে পয়েন্টার পয়েন্টগুলি চালু করে, তখন অ্যাপটি ওয়েব থেকে ডেটা টানবে। যখন ওয়েব অনুরোধটি সম্পূর্ণ হয় (ভিন্ন থ্রেডে) অ্যাপ্লিকেশন একটি নতুন অ্যারে তৈরি করে তখন পরমাণুভাবে সম্পত্তিটিকে একটি নতুন পয়েন্টার মানকে সেট করে। এটি থ্রেডটি নিরাপদ এবং আমার কোনও লকিং কোড লিখতে হবে না, যদি না আমি কিছু মিস করি। আমার কাছে বেশ উপকারী বলে মনে হচ্ছে।
atomicঅর্ধ-মান পঠন ক্রস-থ্রেড প্রতিরোধ করে। (এটি সন্ধান করার জন্য একটি মজাদার বাগ ছিল))
retain/autoreleaseনাচ ছাড়াই কোনও বস্তু ফেরায় । থ্রেড বি অবজেক্টটি প্রকাশ করে। থ্রেড এ বয়ে যায় । atomicনিশ্চিত করে যে থ্রেড এটির ফেরতের মানটির জন্য একটি শক্তিশালী রেফারেন্স (a +1 ধরে রাখা গণনা) রয়েছে।
এটি অ্যাপলের ডকুমেন্টেশনে ব্যাখ্যা করা হয়েছে , তবে আসলে কী ঘটছে তার কয়েকটি উদাহরণ নীচে দেওয়া হল।
মনে রাখবেন যে কোনও "পারমাণবিক" কীওয়ার্ড নেই, আপনি যদি "নন্যাটমিক" নির্দিষ্ট না করেন তবে সম্পত্তিটি পারমাণবিক হয় তবে "পারমাণবিক" স্পষ্টভাবে উল্লেখ করলে ত্রুটি ঘটবে।
আপনি যদি "নন্যাটমিক" নির্দিষ্ট না করেন তবে সম্পত্তিটি পারমাণবিক, তবে আপনি যদি চান তবে সাম্প্রতিক সংস্করণগুলিতে আপনি "পরমাণু" স্পষ্টভাবে নির্দিষ্ট করতে পারেন।
//@property(nonatomic, retain) UITextField *userName;
//Generates roughly
- (UITextField *) userName {
return userName;
}
- (void) setUserName:(UITextField *)userName_ {
[userName_ retain];
[userName release];
userName = userName_;
}
এখন, পারমাণবিক রূপটি আরও জটিল:
//@property(retain) UITextField *userName;
//Generates roughly
- (UITextField *) userName {
UITextField *retval = nil;
@synchronized(self) {
retval = [[userName retain] autorelease];
}
return retval;
}
- (void) setUserName:(UITextField *)userName_ {
@synchronized(self) {
[userName_ retain];
[userName release];
userName = userName_;
}
}
মূলত, থ্রেড সুরক্ষার গ্যারান্টি দিতে পারমাণবিক সংস্করণটিকে একটি লক নিতে হবে, এবং অবজেক্টের রেফ গণনাটি (এবং এটির ভারসাম্য রক্ষার জন্য অটোরিলিজ গণনা) চাপিয়ে দিচ্ছে যাতে বস্তুর আহ্বানকারীটির উপস্থিতির নিশ্চয়তা দেওয়া হয়, অন্যথায় সেখানে সম্ভাব্য রেসের শর্ত যদি অন্য থ্রেড মান নির্ধারণ করে, যার ফলে রেফ গণনাটি 0 এ নেমে যায়।
বৈশিষ্ট্যগুলি স্কেলারের মান বা অবজেক্ট এবং কীভাবে বজায় রাখা, অনুলিপি করা, পঠনযোগ্য, ননোটমিক ইত্যাদির ইন্টারঅ্যাক্ট হয় তার উপর নির্ভর করে এই জিনিসগুলি কীভাবে কাজ করে তার বিবিধ সংখ্যা রয়েছে। সাধারণভাবে সম্পত্তি সংশ্লেষকরা সমস্ত সংমিশ্রনের জন্য "সঠিক জিনিস" কীভাবে করবেন তা কেবল জানেন।
@property (assign) id delegate;কিছু (প্রয়োজন iOS SDK এর জিসিসি 4.2 এআরএম সিঙ্ক্রোনাইজ করা হয় না -Os), যা তার মাঝে একটি জাতি মানে [self.delegate delegateMethod:self];এবং foo.delegate = nil; self.foo = nil; [super dealloc];। দেখুন stackoverflow.com/questions/917884/...
_val/ কী তা নিশ্চিত নই val, তবে না, সত্যই নয়। পারমাণবিক copy/ retainসম্পত্তির জন্য প্রাপ্ত ব্যক্তিকে এটি নিশ্চিত করতে হবে যে সেটিকে অন্য কোনও থ্রেডে ডেকে নিয়ে যাওয়ার কারণে সেটারটি পুনরায় হিসাব শূন্য হয়ে যায় না এমন কোনও জিনিস ফেরত না দেয়, যার মূলত এটি আইভারটি পড়ার দরকার হয়, সেটরটি ধরে রাখার সময় এটি ধরে রাখুন এটি ওভাররাইট-এ-রিলিজ হয়েছে এবং তারপরে এটি ধরে রাখার জন্য ভারসাম্য বজায় রাখতে ore যে মূলত অর্থ উভয় গেটার এবং সেটার একটি লক ব্যবহার করতে হবে (যদি মেমরি লেআউট সংশোধন করা হয়েছে এটা CAS2 নির্দেশাবলী সহ করা সম্ভব হওয়া উচিত; হায়রে -retainএকটি পদ্ধতি কল)।
পার্থক্যটি বোঝার সর্বোত্তম উপায় নীচের উদাহরণটি ব্যবহার করা using
ধরুন "নাম" নামে একটি পারমাণবিক স্ট্রিং সম্পত্তি রয়েছে এবং আপনি যদি [self setName:@"A"]থ্রেড এ [self setName:@"B"]থেকে কল করেন, থ্রেড বি থেকে কল করুন এবং কল করুন[self name] এবং থ্রেড সি থেকে করেন, তবে বিভিন্ন থ্রেডের সমস্ত ক্রিয়াকলাপ ক্রমিকভাবে সঞ্চালিত হবে যার অর্থ যদি একটি থ্রেড একটি সেটার কার্যকর করছে বা গেটর, তারপরে অন্যান্য থ্রেড অপেক্ষা করবে।
এটি সম্পত্তি "নাম" পড়া / লিখতে নিরাপদ করে তোলে, তবে অন্য থ্রেড, ডি, যদি কল করে [name release] একই সাথে তবে এই ক্রিয়াকলাপটি ক্রাশের কারণ হতে পারে কারণ এখানে কোনও সেটার / গেটর কল জড়িত নেই। যার অর্থ কোনও অবজেক্টটি নিরাপদে পড়তে / লিখতে হবে (এটমিক), তবে থ্রেড-নিরাপদ নয় কারণ অন্য থ্রেডগুলি একই সাথে কোনও ধরণের বার্তাকে অবজেক্টে প্রেরণ করতে পারে। বিকাশকারীকে এই জাতীয় সামগ্রীর জন্য থ্রেড-সুরক্ষা নিশ্চিত করা উচিত।
সম্পত্তি "নাম" যদি অসাধারণ ছিল, তবে উপরোক্ত উদাহরণগুলিতে সমস্ত থ্রেড - এ, বি, সি এবং ডি একই সাথে কোনও অনির্দেশ্য ফলাফল উত্পাদন করে। পারমাণবিক ক্ষেত্রে, এ, বি বা সি এর যে কোনও একটি প্রথমে কার্যকর করবে, তবে ডি এখনও সমান্তরালভাবে কার্যকর করতে পারেন।
সিনট্যাক্স এবং শব্দার্থবিদ্যা ইতিমধ্যে এই প্রশ্নের অন্যান্য দুর্দান্ত উত্তরের দ্বারা সংজ্ঞায়িত করা হয়েছে। যেহেতু মৃত্যুদন্ড কার্যকর করা এবং অভিনয়টি বিস্তারিতভাবে নয়, আমি আমার উত্তর যুক্ত করব will
এই 3 এর মধ্যে কার্যকরী পার্থক্য কী?
আমি সবসময় পারমাণবিকটিকে একটি ডিফল্ট হিসাবে বেশ কৌতূহল হিসাবে বিবেচনা করতাম। বিমূর্তকরণ স্তরে আমরা কাজ করি, একটি শ্রেণীর জন্য 100% থ্রেড-সুরক্ষা অর্জনের জন্য একটি শ্রেণীর জন্য পারমাণবিক বৈশিষ্ট্যগুলি ব্যবহার করা একটি কর্নার কেস। সত্যিকারের সঠিক মাল্টিথ্রেডেড প্রোগ্রামগুলির জন্য, প্রোগ্রামার দ্বারা হস্তক্ষেপ প্রায় অবশ্যই একটি প্রয়োজনীয়তা। এদিকে, পারফরম্যান্স বৈশিষ্ট্য এবং সম্পাদন গভীরতার সাথে এখনও বিশদভাবে করা যায় নি। কয়েক বছর ধরে বেশ কয়েকটি ভারী মাল্টিথ্রেডেড প্রোগ্রাম লেখার পরে, আমি আমার সম্পত্তিগুলি nonatomicপুরো সময় হিসাবে ঘোষণা করে যাচ্ছিলাম কারণ পারমাণবিক কোনও কারণে বুদ্ধিমান ছিল না। এই প্রশ্নটিতে পারমাণবিক এবং ননোটমিক বৈশিষ্ট্যগুলির বিশদ আলোচনা করার সময় , আমি কিছু প্রোফাইলিং কিছু কৌতূহলী ফলাফলের মুখোমুখি হয়েছি।
ফাঁসি
ঠিক আছে. আমি যে বিষয়টি প্রথম পরিষ্কার করতে চাই তা হ'ল লকিং বাস্তবায়নটি বাস্তবায়ন-সংজ্ঞায়িত এবং বিমূর্ত হয়। লুই @synchronized(self)তার উদাহরণটিতে ব্যবহার করেছেন - আমি এটিকে বিভ্রান্তির সাধারণ উত্স হিসাবে দেখেছি। বাস্তবায়ন আসলে ব্যবহার করে না @synchronized(self); এটি অবজেক্ট লেভেল স্পিন লক ব্যবহার করে । আমরা সকলেই পরিচিত কনস্ট্রাক্টস ব্যবহার করে লুইয়ের চিত্রটি উচ্চ-স্তরের চিত্রের জন্য ভাল তবে এটি ব্যবহার করা হয় না তা জানা গুরুত্বপূর্ণ @synchronized(self)।
আরেকটি পার্থক্য হ'ল পারমাণবিক বৈশিষ্ট্যগুলি গ্রাহকের মধ্যে আপনার বস্তুগুলি ধরে রাখবে / ছেড়ে দেবে।
কর্মক্ষমতা
আকর্ষণীয় অংশটি এখানে: অবিযোগিত (যেমন একক থ্রেডযুক্ত) ক্ষেত্রে পারমাণবিক সম্পত্তি অ্যাক্সেস ব্যবহারের পারফরম্যান্স কিছু ক্ষেত্রে সত্যই খুব দ্রুত হতে পারে। আদর্শের চেয়ে কম ক্ষেত্রে, পারমাণবিক অ্যাক্সেসগুলির ব্যবহারের ওভারহেডের 20 গুণ বেশি দাম পড়তে পারে nonatomic। থ্রি-বাইট স্ট্রাক্টের জন্য threads টি থ্রেড ব্যবহার করে প্রতিযোগিতামূলক মামলাটি 44 গুণ ধীর ছিল (২.২ গিগাহার্টজ কোর আই 7) কোয়াড কোর, x86_64)। থ্রি-বাইট স্ট্রাক্ট খুব ধীর সম্পত্তির উদাহরণ।
আকর্ষণীয় দিক নোট: থ্রি-বাইট স্ট্রাক্টের ব্যবহারকারী-সংজ্ঞায়িত অ্যাক্সেসরগুলি সংশ্লেষিত পারমাণবিক অ্যাকসেসরের চেয়ে 52 গুণ দ্রুত ছিল; বা 84% সংশ্লেষিত ননোটমিক অ্যাক্সেসরগুলির গতি।
প্রতিদ্বন্দ্বিত মামলায় অবজেক্টগুলিও 50 বারের বেশি হতে পারে।
বাস্তবায়নের ক্ষেত্রে অপ্টিমাইজেশনের সংখ্যা এবং তারতম্যের কারণে, এই প্রসঙ্গে সত্য-বিশ্ব প্রভাবগুলি পরিমাপ করা বেশ কঠিন। আপনি প্রায়শই "এটি বিশ্বাস করুন" এর মতো কিছু শুনতে পাচ্ছেন, যদি না আপনি প্রোফাইল হিসাবে চিহ্নিত হন এবং এটি সমস্যা হিসাবে খুঁজে পাওয়া যায় না। বিমূর্ততা স্তরের কারণে, প্রকৃত প্রভাব পরিমাপ করা আসলে এটি বেশ কঠিন। প্রোফাইলগুলি থেকে প্রকৃত ব্যয় কাটা খুব সময় সাশ্রয়ী হতে পারে এবং বিমূর্ততার কারণে, বেশ ভুল। পাশাপাশি, আরসি বনাম এমআরসি একটি বড় পার্থক্য করতে পারে।
সুতরাং আসুন ফিরে আসি, সম্পত্তি অ্যাক্সেসগুলি বাস্তবায়নের দিকে মনোনিবেশ না করে আমরা সাধারণ সন্দেহভাজনদেরকে অন্তর্ভুক্ত করব objc_msgSendএবং একটি কলকে কল করার জন্য কিছু বাস্তব-বিশ্বের উচ্চ-স্তরের ফলাফলগুলি পরীক্ষা করবNSString এবং অবিসংবাদিত ক্ষেত্রে (প্রাপ্ত প্রতি সেকেন্ডের মান) :
আপনি সম্ভবত অনুমান করেছেন, রেফারেন্স গণনা ক্রিয়াকলাপ / সাইক্লিং এটমিক্সের সাথে এবং এআরসি এর আওতায় গুরুত্বপূর্ণ অবদানকারী। আপনি প্রতিদ্বন্দ্বিত মামলায় আরও বেশি পার্থক্য দেখতে পাবেন।
যদিও আমি পারফরম্যান্সের দিকে গভীর মনোযোগ দিই, তবুও আমি সেমেন্টিক্স ফার্স্ট! । এদিকে, অনেক প্রকল্পের জন্য পারফরম্যান্স একটি নিম্ন অগ্রাধিকার। তবে, কার্যকরভাবে প্রয়োগের বিবরণ এবং আপনি যে প্রযুক্তি ব্যবহার করেন সেগুলি ব্যয় করে অবশ্যই ক্ষতি করে না। আপনার প্রয়োজন, উদ্দেশ্য এবং দক্ষতার জন্য আপনার সঠিক প্রযুক্তি ব্যবহার করা উচিত। আশা করি এটি আপনার কয়েক ঘন্টা তুলনা বাঁচাবে এবং আপনার প্রোগ্রামগুলি ডিজাইন করার সময় আপনাকে আরও ভালভাবে সিদ্ধান্ত নিতে সহায়তা করবে।
NSStringযা অমর নয়: -ARC atomic (BASELINE): 100% -ARC nonatomic, synthesised: 94% -ARC nonatomic, user defined: 86% -MRC nonatomic, user defined: 5% -MRC nonatomic, synthesised: 19% -MRC atomic: 102%- ফলাফলগুলি আজ কিছুটা আলাদা। আমি কোন @synchronizedতুলনা করছিলাম না । @synchronizedশব্দার্থগতভাবে আলাদা, এবং আপনার যদি অনাত্মীয় সমবর্তী প্রোগ্রাম থাকে তবে আমি এটিকে একটি ভাল সরঞ্জাম হিসাবে বিবেচনা করি না। আপনার যদি গতির প্রয়োজন হয় তবে এড়িয়ে চলুন @synchronized।
পারমাণবিক = থ্রেড সুরক্ষা
অ পারমাণবিক = কোনও থ্রেড সুরক্ষা নয়
উদাহরণস্বরূপ চলকগুলি থ্রেড-সেফ থাকে যদি রানটাইম পরিবেশ দ্বারা এই থ্রেডগুলির নির্বাহের সময়সূচী বা ইন্টারলিভিং নির্বিশেষে এবং কলিং কোডের অংশে কোনও অতিরিক্ত সিঙ্ক্রোনাইজেশন বা অন্য সমন্বয় না করে একাধিক থ্রেড থেকে অ্যাক্সেস করা হলে তারা সঠিকভাবে আচরণ করে।
যদি কোনও থ্রেড উদাহরণের মান পরিবর্তন করে তবে পরিবর্তিত মানটি সমস্ত থ্রেডের জন্য উপলব্ধ এবং এক সময় কেবলমাত্র একটি থ্রেড মান পরিবর্তন করতে পারে।
atomic :উদাহরণের পরিবর্তনশীলটি যদি বহুবিবাহিত পরিবেশে অ্যাক্সেস করা যায়।
atomic:তত দ্রুত নয় nonatomicকারণ nonatomicরানটাইম থেকে কোনও ওয়াচডগ কাজের প্রয়োজন নেই।
nonatomic :যদি উদাহরণের পরিবর্তনশীলটি একাধিক থ্রেড দ্বারা পরিবর্তন করা না হয় আপনি এটি ব্যবহার করতে পারেন। এটি কর্মক্ষমতা উন্নত করে।
আমি পারমাণবিক এবং অ পারমাণবিক বৈশিষ্ট্য একটি প্রশংসনীয় ভাল করা ব্যাখ্যা পাওয়া এখানে । এখানে থেকে কিছু প্রাসঙ্গিক পাঠ্য:
'পারমাণবিক' অর্থ এটি ভেঙে ফেলা যায় না। ওএস / প্রোগ্রামিং শর্তে একটি পারমাণবিক ফাংশন কল এমন হয় যা বাধা দেওয়া যায় না - পুরো ফাংশনটি সম্পাদন করতে হবে, এবং সিএসইউ থেকে ওএসের স্বাভাবিক প্রসঙ্গটি স্যুইচিং না হওয়া পর্যন্ত এটি সম্পূর্ণ না হওয়া পর্যন্ত। কেবলমাত্র আপনি জানেন না: যেহেতু একবারে সিপিইউ কেবল একটি কাজ করতে পারে, তাই ওএস সিপিইউতে অ্যাক্সেসটি সামান্য সময়-স্লাইসে চলমান সমস্ত প্রসেসে ঘুরিয়ে দেয়, মায়া দেয়মাল্টিটাস্কিং এর। সিপিইউ শিডিয়ুলার তার কার্য সম্পাদনের যে কোনও সময়ে কোনও প্রক্রিয়া - এমনকি মিড ফাংশন কলেও বাধা দিতে পারে। সুতরাং ভাগ হওয়া কাউন্টার ভেরিয়েবলগুলি আপডেট করার মতো ক্রিয়াকলাপের জন্য যেখানে দুটি প্রক্রিয়া একই সময়ে ভেরিয়েবলটি আপডেট করার চেষ্টা করতে পারে, তাদের অবশ্যই 'পরমাণু' কার্যকর করতে হবে, অর্থাত, অন্য কোনও প্রক্রিয়াটি অদলবদল করার আগে প্রতিটি আপডেট ক্রিয়াকে সম্পূর্ণরূপে শেষ করতে হবে সিপিইউ.
সুতরাং আমি অনুমান করে থাকব যে এক্ষেত্রে পারমাণবিক অর্থ অ্যাট্রিবিউট রিডার পদ্ধতিগুলিকে বাধা দেওয়া যাবে না - ফলস্বরূপ অর্থ যে পদ্ধতি দ্বারা পড়া ভেরিয়েবলগুলি তাদের মানটিকে অর্ধেক পথ পরিবর্তন করতে পারে না কারণ কিছু অন্যান্য থ্রেড / কল / ফাংশন পায় সিপিইউতে বদলানো।
কারণ atomicভেরিয়েবলগুলি বাধা দেওয়া যায় না, যে কোনও বিন্দুতে তাদের দ্বারা থাকা মান হ'ল (থ্রেড-লক) নিরবচ্ছিন্ন হওয়ার গ্যারান্টিযুক্ত , যদিও, এই থ্রেড লকটি নিশ্চিত করে তাদের অ্যাক্সেসকে ধীর করে তোলে। non-atomicঅন্যদিকে ভেরিয়েবলগুলি এ জাতীয় কোনও গ্যারান্টি না দেয় তবে দ্রুত অ্যাক্সেসের বিলাসিতা সরবরাহ করে। এটি সংক্ষেপে, non-atomicযখন আপনি জানেন যে আপনার ভেরিয়েবলগুলি একসাথে একাধিক থ্রেড দ্বারা অ্যাক্সেস করা হবে না এবং জিনিসগুলি গতি বাড়িয়ে তুলবে with
ভেরিয়েবল সম্পত্তি বৈশিষ্ট্যগুলি পরীক্ষা করার জন্য এতগুলি নিবন্ধ, স্ট্যাক ওভারফ্লো পোস্টগুলি এবং ডেমো অ্যাপ্লিকেশনগুলি তৈরি করার পরে, আমি সমস্ত বৈশিষ্ট্যের তথ্য একসাথে রাখার সিদ্ধান্ত নিয়েছি:
atomic // ডিফল্টnonatomicstrong = retain // ডিফল্টweak = unsafe_unretainedretainassign // ডিফল্টunsafe_unretainedcopyreadonlyreadwrite // ডিফল্টনিবন্ধে ভেরিয়েবল সম্পত্তি বৈশিষ্ট্য বা আইওএসে সংশোধক আপনি উপরে উল্লিখিত সমস্ত বৈশিষ্ট্যগুলি খুঁজে পেতে পারেন এবং এটি অবশ্যই আপনাকে সহায়তা করবে।
atomic
atomic এর অর্থ শুধুমাত্র একটি থ্রেড অ্যাক্সেস ভেরিয়েবল (স্থির প্রকার)।atomic থ্রেড নিরাপদ।atomic ডিফল্ট আচরণউদাহরণ:
@property (retain) NSString *name;
@synthesize name;nonatomic
nonatomic মানে একাধিক থ্রেড অ্যাক্সেস ভেরিয়েবল (গতিশীল প্রকার)।nonatomic থ্রেড-অনিরাপদ।nonatomicডিফল্ট আচরণ নয়। আমাদের nonatomicসম্পত্তি বৈশিষ্ট্যে কীওয়ার্ডটি যুক্ত করতে হবে ।উদাহরণ:
@property (nonatomic, retain) NSString *name;
@synthesize name;পারমাণবিক গ্যারান্টি দেয় যে সম্পত্তিটিতে অ্যাক্সেস একটি পারমাণবিক পদ্ধতিতে সঞ্চালিত হবে। উদাহরণস্বরূপ, এটি সর্বদা সম্পূর্ণ সূচনাপ্রাপ্ত বস্তুগুলি ফেরত দেয়, অন্য কোনও থ্রেডে প্রবেশের আগে কোনও থ্রেডে কোনও সম্পত্তির প্রাপ্ত / সেট সম্পূর্ণ করতে হবে।
যদি আপনি কল্পনা করেন যে নীচের ফাংশনটি একবারে দুটি থ্রেডে ঘটছে তবে আপনি দেখতে পাচ্ছেন যে ফলাফলগুলি কেন সুন্দর হবে না।
-(void) setName:(NSString*)string
{
if (name)
{
[name release];
// what happens if the second thread jumps in now !?
// name may be deleted, but our 'name' variable is still set!
name = nil;
}
...
}
পেশাদাররা: প্রতিবার পুরোপুরি আরম্ভ করা অবজেক্টের রিটার্ন মাল্টি-থ্রেডিংয়ের ক্ষেত্রে এটি সেরা পছন্দ করে।
কনস: পারফরম্যান্স হিট, কার্যকর করা একটু ধীর করে তোলে er
পারমাণবিক থেকে পৃথক, এটি প্রতিবার পুরোপুরি আরম্ভকৃত বস্তুর রিটার্ন নিশ্চিত করে না।
পেশাদাররা: অত্যন্ত দ্রুত কার্যকর করা।
কনস: মাল্টি-থ্রেডিংয়ের ক্ষেত্রে আবর্জনা মানের সম্ভাবনা।
সবচেয়ে সহজ উত্তর: আপনার দ্বিতীয় দুটি উদাহরণের মধ্যে কোনও পার্থক্য নেই। ডিফল্টরূপে, সম্পত্তি অ্যাক্সেসরগুলি পারমাণবিক।
কোনও আবর্জনা সংগৃহীত পরিবেশে পারমাণবিক অ্যাক্সেসরগুলি (যেমন ধরে রাখতে / রিলিজ / অটোরিলেজ ব্যবহার করার সময়) অন্য একটি থ্রেডটি মানটির সঠিক সেটিং / প্রাপ্তিতে হস্তক্ষেপ না করে তা নিশ্চিত করতে একটি লক ব্যবহার করবে।
মাল্টি-থ্রেডেড অ্যাপস তৈরি করার সময় আরও কিছু তথ্যের জন্য এবং অন্যান্য বিবেচনার জন্য অ্যাপলের উদ্দেশ্য-সি 2.0 ডকুমেন্টেশনের " পারফরম্যান্স এবং থ্রেডিং " বিভাগটি দেখুন।
পারমাণবিক থ্রেড নিরাপদ , এটি ধীর এবং এটি নিশ্চিত করে (গ্যারান্টিযুক্ত নয়) যে কতগুলি থ্রেড একই জোনে অ্যাক্সেসের চেষ্টা করছে তা বিবেচনা না করেই কেবল লক করা মান সরবরাহ করা হয়। পারমাণবিক ব্যবহার করার সময়, এই ফাংশনের অভ্যন্তরে লিখিত একটি কোডের টুকরোটি সমালোচনামূলক বিভাগের অংশ হয়ে যায়, যেখানে একবারে কেবল একটি থ্রেড কার্যকর করতে পারে।
এটি কেবল থ্রেড সুরক্ষার নিশ্চয়তা দেয়; এটি গ্যারান্টি দেয় না আমার অর্থ হ'ল আপনি নিজের গাড়ির জন্য একজন বিশেষজ্ঞ ড্রাইভার ভাড়া রাখেন, তবুও এটি গ্যারান্টি দেয় না যে গাড়ী কোনও দুর্ঘটনা ঘটবে না। তবে সম্ভাবনা সামান্যতম থেকে যায় remains
পারমাণবিক - এটি ভেঙে ফেলা যায় না, সুতরাং ফলাফলটি প্রত্যাশিত। ননোটমিকের সাথে - যখন অন্য থ্রেড মেমোরি জোনে অ্যাক্সেস করে এটি এটিকে সংশোধন করতে পারে, ফলে ফলাফলটি অপ্রত্যাশিত।
কোড টক:
পারমাণবিক সম্পত্তির থ্রেডের গিটার এবং সেটার নিরাপদ। উদাহরণস্বরূপ যদি আপনি লিখেছেন:
self.myProperty = value;
থ্রেড নিরাপদ।
[myArray addObject:@"Abc"]
থ্রেড নিরাপদ নয়।
"পারমাণবিক" তেমন কোনও কীওয়ার্ড নেই
@property(atomic, retain) UITextField *userName;
আমরা উপরের মত ব্যবহার করতে পারেন
@property(retain) UITextField *userName;
স্ট্যাক ওভারফ্লো প্রশ্ন দেখুন আমি @ প্রপার্টি (পারমাণবিক, ধরে রাখা) এনএসএসস্ট্রিং * মাই স্ট্রিং ব্যবহার করলে আমি সমস্যাগুলি পাচ্ছি ।
পারমাণবিক (ডিফল্ট)
পারমাণবিকটি ডিফল্ট: আপনি যদি কিছু টাইপ না করেন তবে আপনার সম্পত্তি পারমাণবিক। একটি পারমাণবিক সম্পত্তি গ্যারান্টিযুক্ত যে আপনি এটি থেকে পড়ার চেষ্টা করলে আপনি একটি বৈধ মান ফিরে পাবেন। এটির মানটি কী হতে পারে সে সম্পর্কে কোনও গ্যারান্টি দেয় না, তবে জাঙ্ক মেমরির পরিবর্তে আপনি ভাল ডেটা পাবেন। এটি আপনাকে যা করতে দেয় তা হ'ল যদি আপনার একাধিক থ্রেড বা একাধিক প্রক্রিয়া থাকে যা একটি একক ভেরিয়েবলের দিকে নির্দেশ করে, একটি থ্রেড পড়তে পারে এবং অন্য থ্রেডটি লিখতে পারে। যদি তারা একই সময়ে আঘাত করে তবে পাঠকের থ্রেড দুটি মানের একটি পাওয়ার গ্যারান্টিযুক্ত: হয় পরিবর্তনের আগে বা পরিবর্তনের পরে। পারমাণবিক আপনাকে যা দেয় না তা হ'ল আপনি যে মানগুলি পেতে পারেন সে সম্পর্কে কোনও ধরণের গ্যারান্টি। পরমাণু সত্যই সাধারণত থ্রেড-নিরাপদ হয়ে বিভ্রান্ত হয় এবং এটি সঠিক নয়। আপনার থ্রেড সুরক্ষা অন্যান্য উপায়ে গ্যারান্টি দেওয়া প্রয়োজন।
nonatomic
উল্টানো দিকে, অ-পরমাণু যেমন আপনি সম্ভবত অনুমান করতে পারেন, ঠিক এর অর্থ, "সেই পারমাণবিক জিনিসটি করবেন না।" আপনি যা হারিয়েছেন তা হ'ল গ্যারান্টি যে আপনি সর্বদা কিছু ফিরে পাবেন back আপনি যদি কোনও লেখার মাঝখানে পড়ার চেষ্টা করেন তবে আবর্জনার ডেটা ফিরে পেতে পারেন। তবে, অন্যদিকে, আপনি কিছুটা দ্রুত যান। যেহেতু পারমাণবিক বৈশিষ্ট্যগুলি গ্যারান্টি দিতে কিছু যাদু করতে হয় যে আপনি কোনও মান ফিরে পাবেন, সেগুলি কিছুটা ধীর। যদি আপনি এমন কোনও সম্পত্তি হয়ে থাকেন যা আপনি অনেকগুলি অ্যাক্সেস করছেন তবে আপনি যে গতিদণ্ডের শাস্তি বহন করছেন না তা নিশ্চিত করতে আপনি ননোটমিকের কাছে নেমে যেতে চাইতে পারেন।
এখানে আরও দেখুন: https://realm.io/news/tmi-objective-c-property-attributes/
ডিফল্ট হল atomic, এর মানে এটা যখনই আপনি সম্পত্তি ব্যবহার কর্মক্ষমতা টাকা লাগে, কিন্তু এটা থ্রেড নিরাপদ। অবজেক্টিভ-সি যা করে তা লক সেট করে, তাই কেবল আসল থ্রেড চলকটি অ্যাক্সেস করতে পারে, যতক্ষণ না সেটার / গেটর কার্যকর হয়।
একটি ivar _ অভ্যন্তরের সাথে সম্পত্তি একটি এমআরসি সঙ্গে উদাহরণ:
[_internal lock]; //lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;
সুতরাং এই শেষ দুটি একই:
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName; // defaults to atomic
অন্যদিকে আপনার nonatomicকোডটিতে কিছুই যুক্ত হয় না। সুতরাং আপনি যদি সুরক্ষা ব্যবস্থা নিজেকে কোড করেন তবে এটি কেবল থ্রেডই নিরাপদ।
@property(nonatomic, retain) UITextField *userName;
মূলশব্দগুলিকে মোটে প্রথম সম্পত্তি বৈশিষ্ট্য হিসাবে লিখতে হবে না।
ভুলে যাবেন না, এর অর্থ এই নয় যে পুরো সম্পত্তিটি থ্রেড-নিরাপদ। কেবলমাত্র সেটার / গেটারের মেথড কল। তবে আপনি যদি সেটার ব্যবহার করেন এবং তার পরে একই সময়ে একজন গিটার 2 টি ভিন্ন থ্রেড সহ, এটিও ভেঙে যেতে পারে!
আপনি শুরু করার আগে: আপনার অবশ্যই অবশ্যই জেনে রাখা উচিত যে নতুন লেখক হওয়ার জন্য মেমরির প্রতিটি অবজেক্ট মেমরি থেকে বিলোপ করা দরকার। আপনি কাগজে যেমন কিছু করেন ঠিক তেমন কিছু লিখতে পারবেন না। আপনাকে অবশ্যই প্রথমে এটি মুছে ফেলতে হবে (তারপরে) এবং তারপরে আপনি এটিতে লিখতে পারেন। এই মুহুর্তে যদি মুছে ফেলা হয় (বা অর্ধেক সম্পন্ন হয়েছে) এবং এখনও কিছুই লেখা হয়নি (বা অর্ধেক লিখেছেন) এবং আপনি পড়ার চেষ্টা করেন এটি খুব সমস্যাযুক্ত হতে পারে! পারমাণবিক এবং ননোটমিক আপনাকে এই সমস্যাটিকে বিভিন্ন উপায়ে চিকিত্সা করতে সহায়তা করে।
প্রথমে এই প্রশ্নটি পড়ুন এবং তারপরে বুবুমের উত্তরটি পড়ুন । এছাড়াও, তারপরে আমার সারাংশটি পড়ুন।
atomic সবসময় গ্যারান্টি দেবে
অবটেন-সি-তে মেমরি পরিচালনা করার পদ্ধতিটিই পুনরায় রাখুন। আপনি যখন কোনও বস্তু তৈরি করেন, এটির একটি রক্ষণ গণনা থাকে ১। আপনি যখন কোনও বস্তুকে একটি রক্ষণাবেক্ষণ বার্তা প্রেরণ করেন, তখন তার ধরে রাখার গণনাটি ১ দ্বারা বাড়ানো হয় you যখন আপনি কোনও বস্তুকে একটি মুক্তির বার্তা প্রেরণ করেন, তখন তার ধরে রাখার গণনা হ্রাস পাবে যখন আপনি কোনও বস্তুকে একটি স্বতঃপ্রকাশ বার্তা প্রেরণ করুন , ভবিষ্যতে কোনও পর্যায়ে এর ধরে রাখার সংখ্যা 1 দ্বারা হ্রাস পেয়েছে। যদি কোনও অবজেক্টের ধরে রাখার গণনা 0 টি হ্রাস করা হয় তবে তা নির্বিঘ্ন হয়।
কি?! মাল্টিথ্রেডিং এবং থ্রেড সুরক্ষা আলাদা?
হ্যাঁ. মাল্টিথ্রেডিংয়ের অর্থ: একাধিক থ্রেড একই সাথে ডেটা ভাগ করা অংশ পড়তে পারে এবং আমরা ক্রাশ করব না, তবুও এটি কোনও গ্যারান্টি দেয় না যে আপনি একটি স্ব-স্বাবলম্বিত মান থেকে পড়ছেন না। থ্রেড সুরক্ষার সাথে এটির নিশ্চয়তা রয়েছে যে আপনি যা পড়েছেন তা স্বয়ংক্রিয়ভাবে প্রকাশিত হয় না। আমরা ডিফল্টরূপে সমস্ত কিছুকে পারমাণবিক না করার কারণ হ'ল, এখানে একটি পারফরম্যান্স ব্যয় হয় এবং বেশিরভাগ জিনিসের জন্য সত্যই থ্রেড সুরক্ষার প্রয়োজন হয় না। আমাদের কোডের কয়েকটি অংশের এটির প্রয়োজন এবং সেই কয়েকটি অংশের জন্য, আমাদের লকস, মিউটেক্স বা সিঙ্ক্রোনাইজেশন ব্যবহার করে থ্রেড-নিরাপদে আমাদের কোডটি লিখতে হবে।
nonatomic
সামগ্রিকভাবে তারা 2 দিক থেকে পৃথক:
অটোরিলেজ পুল থাকার বা না থাকার কারণে ক্রাশ বা না হওয়া।
একটি 'এখনও সমাপ্ত লেখা বা খালি মান' এর মাঝখানে পড়তে দেওয়া বা মানটি সম্পূর্ণরূপে লেখার সময় কেবল অনুমতি দেওয়ার অনুমতি না দেওয়া এবং পড়ার অনুমতি দেওয়া ।
আপনি যদি নিজের সম্পত্তিটিকে বহু-থ্রেডযুক্ত কোডে ব্যবহার করছেন তবে আপনি ননোটমিক এবং পারমাণবিক বৈশিষ্ট্যের মধ্যে পার্থক্য দেখতে সক্ষম হবেন। ননোটমিক পারমাণবিকের চেয়ে দ্রুত এবং পারমাণবিক থ্রেড-নিরাপদ, ননোটমিক নয়।
বিজয়েন্দ্র ত্রিপাঠি ইতিমধ্যে বহু-থ্রেড পরিবেশের জন্য একটি উদাহরণ দিয়েছেন।
কীভাবে ঘোষণা করবেন:
যেমন পারমাণবিক ডিফল্ট তাই,
@property (retain) NSString *name;
এবং বাস্তবায়ন ফাইলের মধ্যে
self.name = @"sourov";
মনে করুন তিনটি বৈশিষ্ট্য সম্পর্কিত কোনও কাজ are
@property (retain) NSString *name;
@property (retain) NSString *A;
@property (retain) NSString *B;
self.name = @"sourov";
সমস্ত বৈশিষ্ট্য সমান্তরালভাবে কাজ করে (সংশ্লেষের মতো)।
আপনি যদি থ্রেড এ থেকে "নাম" কল করেন ,
এবং
একই সাথে ফোন দিলে
[self setName:@"Datta"]
থ্রেড বি থেকে ,
এখন যদি * নাম সম্পত্তি nonatomic হয় তারপর
কেন অ পারমাণবিককে থ্রেডকে অনিরাপদ বলা হয় তবে এটি সমান্তরাল সম্পাদনের কারণে কার্য সম্পাদনে দ্রুত
এখন যদি * নামের সম্পত্তিটি পারমাণবিক হয়
এ কারণেই পারমাণবিককে থ্রেড নিরাপদ বলা হয় এবং এ কারণেই এটিকে রিড-রাইট নিরাপদ বলা হয়
এই ধরনের পরিস্থিতি অপারেশন সিরিয়ালি সম্পাদন করবে। এবং কর্মক্ষমতা ধীর
- ননোটমিক মানে একাধিক থ্রেড অ্যাক্সেস ভেরিয়েবল (ডায়নামিক টাইপ)।
- ননঅ্যাটমিক থ্রেড অনিরাপদ।
- তবে এটি পারফরম্যান্সে দ্রুত
-নোটমিক হ'ল ডিফল্ট আচরণ নয়, আমাদের সম্পত্তি বৈশিষ্ট্যে ননোটমিক কীওয়ার্ড যুক্ত করতে হবে।
ইন সুইফ্ট নিশ্চিতকরণের জন্য যে ওবিজেসি অর্থে সুইফ্ট বৈশিষ্ট্যগুলি অসাধারণ। একটি কারণ হ'ল প্রতি-সম্পত্তি পারমাণবিকতা আপনার প্রয়োজনের জন্য যথেষ্ট কিনা তা নিয়ে আপনি ভাবেন।
তথ্যসূত্র: https://forums.developer.apple.com/thread/25642
ইতস্তত আরও তথ্যের দয়া করে ওয়েবসাইট ভিজিট করুন http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html
atomicহয় না থ্রেড-নিরাপদ! এটি থ্রেড সমস্যার প্রতিরোধী তবে থ্রেড-নিরাপদ নয়। এটি কেবল নিশ্চিত করে যে আপনি পুরো মানটি পেয়ে যাবেন, যেমন একটি "সঠিক" মান (বাইনারি স্তর), তবে কোনওভাবেই এটি নিশ্চিত করবে না যে এটি আপনার ব্যবসায়ের যুক্তির জন্য বর্তমান এবং "সঠিক" মান (এটি অতীতের মান হতে পারে এবং আপনার যুক্তি দ্বারা অবৈধ)।
পারমাণবিক পরমাণু (ডিফল্ট)
পারমাণবিকটি ডিফল্ট: আপনি যদি কিছু টাইপ না করেন তবে আপনার সম্পত্তি পারমাণবিক। একটি পারমাণবিক সম্পত্তি গ্যারান্টিযুক্ত যে আপনি এটি থেকে পড়ার চেষ্টা করলে আপনি একটি বৈধ মান ফিরে পাবেন। এটির মানটি কী হতে পারে সে সম্পর্কে কোনও গ্যারান্টি দেয় না, তবে জাঙ্ক মেমরির পরিবর্তে আপনি ভাল ডেটা পাবেন। এটি আপনাকে যা করতে দেয় তা হ'ল যদি আপনার একাধিক থ্রেড বা একাধিক প্রক্রিয়া থাকে যা একটি একক ভেরিয়েবলের দিকে নির্দেশ করে, একটি থ্রেড পড়তে পারে এবং অন্য থ্রেডটি লিখতে পারে। যদি তারা একই সময়ে আঘাত করে তবে পাঠকের থ্রেড দুটি মানের একটি পাওয়ার গ্যারান্টিযুক্ত: হয় পরিবর্তনের আগে বা পরিবর্তনের পরে। পারমাণবিক আপনাকে যা দেয় না তা হ'ল আপনি যে মানগুলি পেতে পারেন সে সম্পর্কে কোনও ধরণের গ্যারান্টি। পরমাণু সত্যই সাধারণত থ্রেড-নিরাপদ হয়ে বিভ্রান্ত হয় এবং এটি সঠিক নয়। আপনার থ্রেড সুরক্ষা অন্যান্য উপায়ে গ্যারান্টি দেওয়া প্রয়োজন।
nonatomic
উল্টানো দিকে, অ-পরমাণু যেমন আপনি সম্ভবত অনুমান করতে পারেন, ঠিক এর অর্থ, "সেই পারমাণবিক জিনিসটি করবেন না।" আপনি যা হারিয়েছেন তা হ'ল গ্যারান্টি যে আপনি সর্বদা কিছু ফিরে পাবেন back আপনি যদি কোনও লেখার মাঝখানে পড়ার চেষ্টা করেন তবে আবর্জনার ডেটা ফিরে পেতে পারেন। তবে, অন্যদিকে, আপনি কিছুটা দ্রুত যান। যেহেতু পারমাণবিক বৈশিষ্ট্যগুলি গ্যারান্টি দিতে কিছু যাদু করতে হয় যে আপনি কোনও মান ফিরে পাবেন, সেগুলি কিছুটা ধীর। যদি আপনি এমন কোনও সম্পত্তি হয়ে থাকেন যা আপনি অনেকগুলি অ্যাক্সেস করছেন তবে আপনি যে গতিদণ্ডের শাস্তি বহন করছেন না তা নিশ্চিত করতে আপনি ননোটমিকের কাছে নেমে যেতে চাইতে পারেন। প্রবেশ
সৌজন্য https://academy.realm.io/posts/tmi-objective-c-property-attributes/
পারমাণবিক সম্পত্তি বৈশিষ্ট্য (পারমাণবিক এবং ননোটমিক) সম্পর্কিত সুইফট সম্পত্তি সম্পর্কিত ঘোষণায় প্রতিফলিত হয় না, তবে সুইফট থেকে আমদানিকৃত সম্পত্তি অ্যাক্সেস করা হলে অবজেক্টিভ-সি বাস্তবায়নের পারমাণবিকতা গ্যারান্টি এখনও বহাল থাকে।
সুতরাং - আপনি যদি উদ্দেশ্য-সি-তে কোনও পারমাণবিক সম্পত্তি সংজ্ঞায়িত করেন তবে সুইফট যখন ব্যবহার করবেন এটি পরমাণু থেকে যাবে।
সৌজন্য https://medium.com/@YogevSitton/atomic-vs-non-atomic-properties-crash-course-d11c23f4366c
পারমাণবিক সম্পত্তি কতগুলি থ্রেড এতে গেটর এবং সেটার করছে তা নির্বিশেষে পুরোপুরি প্রাথমিক মানের মান ধরে রাখতে নিশ্চিত করে।
ননোটমিক বৈশিষ্ট্যটি নির্দিষ্ট করে যে সংশ্লেষিত অ্যাক্সেসরগুলি কেবল কোনও মান সেট করে দেয় বা প্রত্যাবর্তন করে, একই ধরণের বিভিন্ন থ্রেড থেকে একই মানটি যদি একসাথে অ্যাক্সেস করা হয় তবে কী হবে তার কোনও গ্যারান্টি নেই।
সত্যটি হ'ল তারা পারমাণবিক সম্পত্তি প্রয়োগের জন্য স্পিন লক ব্যবহার করে। নীচের মত কোড:
static inline void reallySetProperty(id self, SEL _cmd, id newValue,
ptrdiff_t offset, bool atomic, bool copy, bool mutableCopy)
{
id oldValue;
id *slot = (id*) ((char*)self + offset);
if (copy) {
newValue = [newValue copyWithZone:NULL];
} else if (mutableCopy) {
newValue = [newValue mutableCopyWithZone:NULL];
} else {
if (*slot == newValue) return;
newValue = objc_retain(newValue);
}
if (!atomic) {
oldValue = *slot;
*slot = newValue;
} else {
spin_lock_t *slotlock = &PropertyLocks[GOODHASH(slot)];
_spin_lock(slotlock);
oldValue = *slot;
*slot = newValue;
_spin_unlock(slotlock);
}
objc_release(oldValue);
}
সম্পূর্ণ বিভ্রান্তি সরল করতে, আসুন আমরা মুটেক্স লকটি বুঝতে পারি।
নাম অনুসারে মুটেক্স লকটি বস্তুর পরিবর্তনের বিষয়টি লক করে। সুতরাং যদি কোনও শ্রেণি দ্বারা অবজেক্টটি অ্যাক্সেস করা হয় তবে অন্য কোনও শ্রেণি একই বস্তুকে অ্যাক্সেস করতে পারে না।
আইওএস-এ, @sychroniseমিউটেক্স লকটিও সরবরাহ করে ow এখন এটি ফিফো মোডে পরিবেশন করে এবং নিশ্চিত করে যে একই ক্লাসটি ভাগ করে নেওয়ার কারণে দুটি শ্রেণীর দ্বারা প্রবাহ প্রভাবিত হবে না। তবে, যদি টাস্কটি মূল থ্রেডে থাকে তবে পারমাণবিক বৈশিষ্ট্য ব্যবহার করে অবজেক্টে অ্যাক্সেস এড়িয়ে চলুন কারণ এটি আপনার ইউআই ধরে রাখতে পারে এবং কার্য সম্পাদনকে হ্রাস করতে পারে।
পারমাণবিক: এনএসলক ব্যবহার করে থ্রেড লক করে থ্রেড-সুরক্ষা নিশ্চিত করুন।
অ পরমাণু: থ্রেড-লকিংয়ের কোনও ব্যবস্থা না থাকায় থ্রেড-সুরক্ষা নিশ্চিত করে না।
পারমাণবিক বৈশিষ্ট্য : - যখন পারমাণবিক সম্পত্তির সাথে নির্ধারিত কোনও চলকটির অর্থ এটির কেবল একটি থ্রেড অ্যাক্সেস থাকে এবং এটি থ্রেড নিরাপদ হবে এবং পারফরম্যান্সের দৃষ্টিকোণে ভাল হবে, তখন ডিফল্ট আচরণ থাকবে।
অ পারমাণবিক বৈশিষ্ট্য : - যখন পারমাণবিক সম্পত্তির সাথে একটি ভেরিয়েবল নির্ধারিত হয় যার অর্থ এটির একাধিক থ্রেড অ্যাক্সেস রয়েছে এবং এটি থ্রেড নিরাপদ হবে না এবং কার্য সম্পাদনের দৃষ্টিতে ধীর হয়ে যাবে, তখন ডিফল্ট আচরণ হবে এবং যখন দুটি পৃথক থ্রেড একই সময়ে চলক অ্যাক্সেস করতে চায় এটি অপ্রত্যাশিত ফলাফল দেবে।