পারমাণবিক এবং ননোটমিক বৈশিষ্ট্যের মধ্যে পার্থক্য কী?


1851

আমাদের কি করতে atomicএবং nonatomicসম্পত্তি ঘোষণা অর্থ?

@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;

এই তিনটির মধ্যে অপারেশনাল পার্থক্য কী?


উত্তর:


1761

শেষ দুটি একই; "পারমাণবিক" হ'ল ডিফল্ট আচরণ ( নোট করুন যে এটি আসলে কোনও মূলশব্দ নয়; এটি কেবলমাত্র অনুপস্থিতির দ্বারা নির্দিষ্ট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নির্ভরযোগ্য বৈশিষ্ট্যগুলি আপডেট করা হচ্ছে সে সময় অ্যাক্সেস বাদ দিতে দেয় ।


21
প্রদত্ত যে কোনও থ্রেড-সেফ কোড তার নিজস্ব লকিং ইত্যাদি করবে, আপনি কখন পারমাণবিক সম্পত্তি অ্যাক্সেসর ব্যবহার করতে চান? আমি একটি ভাল উদাহরণ চিন্তা করতে সমস্যা হচ্ছে।
ড্যানিয়েল ডিকিসন

8
@ বুবাম জ্ঞান করে। আমি আর একটি উত্তরে আপনার মন্তব্যটি পছন্দ করি যে থ্রেড-সুরক্ষা আরও একটি মডেল স্তরের উদ্বেগ। আইবিএম থ্রেড সুরক্ষা সংজ্ঞা থেকে: আইবিএমএইচ / ওয়াইটিবিজেওয়াই "যদি কোনও শ্রেণি সঠিকভাবে প্রয়োগ করা হয়, যা এটির নির্দিষ্টকরণের সাথে সঙ্গতিপূর্ণ বলে দেওয়ার অন্য একটি উপায়, অপারেশনগুলির কোনও অনুক্রম (পাবলিক ফিল্ডগুলি পড়া বা লেখার জন্য এবং পাবলিক পদ্ধতিতে কল করা) না "শ্রেণীর অবজেক্টগুলিতে অবজেক্টটিকে একটি অবৈধ অবস্থায় রাখতে, অবজেক্টটিকে অবৈধ অবস্থায় থাকতে পর্যবেক্ষণ করতে বা শ্রেণীর আক্রমণকারী, পূর্বশর্ত বা পোস্টকন্ডিশনগুলির লঙ্ঘন করতে সক্ষম হওয়া উচিত" "
বেন ফ্লিন

6
এখানে @ স্টিভেনক্রার এর অনুরূপ একটি উদাহরণ রয়েছে: আমার কাছে এমন একটি রয়েছে @property NSArray* astronomicalEvents;যা আমি ইউআইতে প্রদর্শন করতে চান এমন ডেটা তালিকাভুক্ত করে। অ্যাপ্লিকেশনটি যখন খালি অ্যারেটিতে পয়েন্টার পয়েন্টগুলি চালু করে, তখন অ্যাপটি ওয়েব থেকে ডেটা টানবে। যখন ওয়েব অনুরোধটি সম্পূর্ণ হয় (ভিন্ন থ্রেডে) অ্যাপ্লিকেশন একটি নতুন অ্যারে তৈরি করে তখন পরমাণুভাবে সম্পত্তিটিকে একটি নতুন পয়েন্টার মানকে সেট করে। এটি থ্রেডটি নিরাপদ এবং আমার কোনও লকিং কোড লিখতে হবে না, যদি না আমি কিছু মিস করি। আমার কাছে বেশ উপকারী বলে মনে হচ্ছে।
বাগগাফ

10
@ হটলিক্স আরও একটি মজা; নির্দিষ্ট আর্কিটেকচারে (কোনটি মনে করতে পারে না), argument৪ বিট মান একটি আর্গুমেন্ট হিসাবে পাস হতে পারে একটি রেজিস্টারে অর্ধেক এবং স্ট্যাকের অর্ধেক পাস হতে পারে। atomicঅর্ধ-মান পঠন ক্রস-থ্রেড প্রতিরোধ করে। (এটি সন্ধান করার জন্য একটি মজাদার বাগ ছিল))
ববম

8
@ কংলিউ থ্রেড এ retain/autoreleaseনাচ ছাড়াই কোনও বস্তু ফেরায় । থ্রেড বি অবজেক্টটি প্রকাশ করে। থ্রেড এ বয়ে যায় । atomicনিশ্চিত করে যে থ্রেড এটির ফেরতের মানটির জন্য একটি শক্তিশালী রেফারেন্স (a +1 ধরে রাখা গণনা) রয়েছে।
1313 এ ববিম

360

এটি অ্যাপলের ডকুমেন্টেশনে ব্যাখ্যা করা হয়েছে , তবে আসলে কী ঘটছে তার কয়েকটি উদাহরণ নীচে দেওয়া হল।

মনে রাখবেন যে কোনও "পারমাণবিক" কীওয়ার্ড নেই, আপনি যদি "নন্যাটমিক" নির্দিষ্ট না করেন তবে সম্পত্তিটি পারমাণবিক হয় তবে "পারমাণবিক" স্পষ্টভাবে উল্লেখ করলে ত্রুটি ঘটবে।

আপনি যদি "নন্যাটমিক" নির্দিষ্ট না করেন তবে সম্পত্তিটি পারমাণবিক, তবে আপনি যদি চান তবে সাম্প্রতিক সংস্করণগুলিতে আপনি "পরমাণু" স্পষ্টভাবে নির্দিষ্ট করতে পারেন।

//@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 এ নেমে যায়।

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


8
@ লুইস গারবার্গ: আমি বিশ্বাস করি যে আপনি যদি একই বস্তুটি নির্ধারিত করতে চেষ্টা করেন (তবে: ব্যবহারকারীনাম == ব্যবহারকারীর নাম_)
ফ্লোরিন

5
আপনার কোডটি সামান্য বিভ্রান্তিকর; নেই কোন কি পারমাণবিক getters / setters সিঙ্ক্রোনাইজ হয় গ্যারান্টি। সমালোচকদের, @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/...
TC।

@ সাইফুলনিশ আমি কী _val/ কী তা নিশ্চিত নই val, তবে না, সত্যই নয়। পারমাণবিক copy/ retainসম্পত্তির জন্য প্রাপ্ত ব্যক্তিকে এটি নিশ্চিত করতে হবে যে সেটিকে অন্য কোনও থ্রেডে ডেকে নিয়ে যাওয়ার কারণে সেটারটি পুনরায় হিসাব শূন্য হয়ে যায় না এমন কোনও জিনিস ফেরত না দেয়, যার মূলত এটি আইভারটি পড়ার দরকার হয়, সেটরটি ধরে রাখার সময় এটি ধরে রাখুন এটি ওভাররাইট-এ-রিলিজ হয়েছে এবং তারপরে এটি ধরে রাখার জন্য ভারসাম্য বজায় রাখতে ore যে মূলত অর্থ উভয় গেটার এবং সেটার একটি লক ব্যবহার করতে হবে (যদি মেমরি লেআউট সংশোধন করা হয়েছে এটা CAS2 নির্দেশাবলী সহ করা সম্ভব হওয়া উচিত; হায়রে -retainএকটি পদ্ধতি কল)।
টিসি।

@ টিসি এটি বেশ কিছুক্ষণ হয়েছে তবে আমি যা লিখতে চেয়েছিলাম তা সম্ভবত এটি ছিল: gist.github.com/fjolnir/5d96b3272c6255f6baae তবে হ্যাঁ সেটফুর আগে পাঠকের দ্বারা পুরানো মানটি পড়া সম্ভব: রিটার্ন, এবং প্রকাশের আগে প্রকাশ করা হয়েছিল পাঠক এটি ফেরত দেয়। তবে যদি সেটারটি -আরলেজের পরিবর্তে অটোরিলেজ ব্যবহার করে তবে এটি ঠিক হয়ে যাবে।
Fjölnir

@ সাইফুলনিশ দুর্ভাগ্যক্রমে, না: এটি সেটারের থ্রেডটিতে স্বতঃস্ফুর্ত হয়, যখন এটি গেটারের থ্রেডে স্বতঃস্ফূর্তভাবে প্রয়োজন। দেখে মনে হচ্ছে যে স্ট্যাকের বাইরে চলে যাওয়ার (পাতলা) সম্ভাবনা রয়েছে কারণ আপনি পুনরাবৃত্তি ব্যবহার করছেন।
টিসি।

169

পারমাণবিক

  • ডিফল্ট আচরণ
  • অন্য প্রক্রিয়াটি ভেরিয়েবল অ্যাক্সেস করার আগে, সিপিইউ দ্বারা বর্তমান প্রক্রিয়াটি সম্পন্ন হয়েছে তা নিশ্চিত করবে
  • দ্রুত নয়, কারণ এটি প্রক্রিয়া সম্পূর্ণরূপে সম্পন্ন হওয়ার বিষয়টি নিশ্চিত করে

অ আণবিক

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

137

পার্থক্যটি বোঝার সর্বোত্তম উপায় নীচের উদাহরণটি ব্যবহার করা using

ধরুন "নাম" নামে একটি পারমাণবিক স্ট্রিং সম্পত্তি রয়েছে এবং আপনি যদি [self setName:@"A"]থ্রেড এ [self setName:@"B"]থেকে কল করেন, থ্রেড বি থেকে কল করুন এবং কল করুন[self name] এবং থ্রেড সি থেকে করেন, তবে বিভিন্ন থ্রেডের সমস্ত ক্রিয়াকলাপ ক্রমিকভাবে সঞ্চালিত হবে যার অর্থ যদি একটি থ্রেড একটি সেটার কার্যকর করছে বা গেটর, তারপরে অন্যান্য থ্রেড অপেক্ষা করবে।

এটি সম্পত্তি "নাম" পড়া / লিখতে নিরাপদ করে তোলে, তবে অন্য থ্রেড, ডি, যদি কল করে [name release] একই সাথে তবে এই ক্রিয়াকলাপটি ক্রাশের কারণ হতে পারে কারণ এখানে কোনও সেটার / গেটর কল জড়িত নেই। যার অর্থ কোনও অবজেক্টটি নিরাপদে পড়তে / লিখতে হবে (এটমিক), তবে থ্রেড-নিরাপদ নয় কারণ অন্য থ্রেডগুলি একই সাথে কোনও ধরণের বার্তাকে অবজেক্টে প্রেরণ করতে পারে। বিকাশকারীকে এই জাতীয় সামগ্রীর জন্য থ্রেড-সুরক্ষা নিশ্চিত করা উচিত।

সম্পত্তি "নাম" যদি অসাধারণ ছিল, তবে উপরোক্ত উদাহরণগুলিতে সমস্ত থ্রেড - এ, বি, সি এবং ডি একই সাথে কোনও অনির্দেশ্য ফলাফল উত্পাদন করে। পারমাণবিক ক্ষেত্রে, এ, বি বা সি এর যে কোনও একটি প্রথমে কার্যকর করবে, তবে ডি এখনও সমান্তরালভাবে কার্যকর করতে পারেন।


116

সিনট্যাক্স এবং শব্দার্থবিদ্যা ইতিমধ্যে এই প্রশ্নের অন্যান্য দুর্দান্ত উত্তরের দ্বারা সংজ্ঞায়িত করা হয়েছে। যেহেতু মৃত্যুদন্ড কার্যকর করা এবং অভিনয়টি বিস্তারিতভাবে নয়, আমি আমার উত্তর যুক্ত করব will

এই 3 এর মধ্যে কার্যকরী পার্থক্য কী?

আমি সবসময় পারমাণবিকটিকে একটি ডিফল্ট হিসাবে বেশ কৌতূহল হিসাবে বিবেচনা করতাম। বিমূর্তকরণ স্তরে আমরা কাজ করি, একটি শ্রেণীর জন্য 100% থ্রেড-সুরক্ষা অর্জনের জন্য একটি শ্রেণীর জন্য পারমাণবিক বৈশিষ্ট্যগুলি ব্যবহার করা একটি কর্নার কেস। সত্যিকারের সঠিক মাল্টিথ্রেডেড প্রোগ্রামগুলির জন্য, প্রোগ্রামার দ্বারা হস্তক্ষেপ প্রায় অবশ্যই একটি প্রয়োজনীয়তা। এদিকে, পারফরম্যান্স বৈশিষ্ট্য এবং সম্পাদন গভীরতার সাথে এখনও বিশদভাবে করা যায় নি। কয়েক বছর ধরে বেশ কয়েকটি ভারী মাল্টিথ্রেডেড প্রোগ্রাম লেখার পরে, আমি আমার সম্পত্তিগুলি nonatomicপুরো সময় হিসাবে ঘোষণা করে যাচ্ছিলাম কারণ পারমাণবিক কোনও কারণে বুদ্ধিমান ছিল না। এই প্রশ্নটিতে পারমাণবিক এবং ননোটমিক বৈশিষ্ট্যগুলির বিশদ আলোচনা করার সময় , আমি কিছু প্রোফাইলিং কিছু কৌতূহলী ফলাফলের মুখোমুখি হয়েছি।

ফাঁসি

ঠিক আছে. আমি যে বিষয়টি প্রথম পরিষ্কার করতে চাই তা হ'ল লকিং বাস্তবায়নটি বাস্তবায়ন-সংজ্ঞায়িত এবং বিমূর্ত হয়। লুই @synchronized(self)তার উদাহরণটিতে ব্যবহার করেছেন - আমি এটিকে বিভ্রান্তির সাধারণ উত্স হিসাবে দেখেছি। বাস্তবায়ন আসলে ব্যবহার করে না @synchronized(self); এটি অবজেক্ট লেভেল স্পিন লক ব্যবহার করে । আমরা সকলেই পরিচিত কনস্ট্রাক্টস ব্যবহার করে লুইয়ের চিত্রটি উচ্চ-স্তরের চিত্রের জন্য ভাল তবে এটি ব্যবহার করা হয় না তা জানা গুরুত্বপূর্ণ @synchronized(self)

আরেকটি পার্থক্য হ'ল পারমাণবিক বৈশিষ্ট্যগুলি গ্রাহকের মধ্যে আপনার বস্তুগুলি ধরে রাখবে / ছেড়ে দেবে।

কর্মক্ষমতা

আকর্ষণীয় অংশটি এখানে: অবিযোগিত (যেমন একক থ্রেডযুক্ত) ক্ষেত্রে পারমাণবিক সম্পত্তি অ্যাক্সেস ব্যবহারের পারফরম্যান্স কিছু ক্ষেত্রে সত্যই খুব দ্রুত হতে পারে। আদর্শের চেয়ে কম ক্ষেত্রে, পারমাণবিক অ্যাক্সেসগুলির ব্যবহারের ওভারহেডের 20 গুণ বেশি দাম পড়তে পারে nonatomic। থ্রি-বাইট স্ট্রাক্টের জন্য threads টি থ্রেড ব্যবহার করে প্রতিযোগিতামূলক মামলাটি 44 গুণ ধীর ছিল (২.২ গিগাহার্টজ কোর আই 7) কোয়াড কোর, x86_64)। থ্রি-বাইট স্ট্রাক্ট খুব ধীর সম্পত্তির উদাহরণ।

আকর্ষণীয় দিক নোট: থ্রি-বাইট স্ট্রাক্টের ব্যবহারকারী-সংজ্ঞায়িত অ্যাক্সেসরগুলি সংশ্লেষিত পারমাণবিক অ্যাকসেসরের চেয়ে 52 গুণ দ্রুত ছিল; বা 84% সংশ্লেষিত ননোটমিক অ্যাক্সেসরগুলির গতি।

প্রতিদ্বন্দ্বিত মামলায় অবজেক্টগুলিও 50 বারের বেশি হতে পারে।

বাস্তবায়নের ক্ষেত্রে অপ্টিমাইজেশনের সংখ্যা এবং তারতম্যের কারণে, এই প্রসঙ্গে সত্য-বিশ্ব প্রভাবগুলি পরিমাপ করা বেশ কঠিন। আপনি প্রায়শই "এটি বিশ্বাস করুন" এর মতো কিছু শুনতে পাচ্ছেন, যদি না আপনি প্রোফাইল হিসাবে চিহ্নিত হন এবং এটি সমস্যা হিসাবে খুঁজে পাওয়া যায় না। বিমূর্ততা স্তরের কারণে, প্রকৃত প্রভাব পরিমাপ করা আসলে এটি বেশ কঠিন। প্রোফাইলগুলি থেকে প্রকৃত ব্যয় কাটা খুব সময় সাশ্রয়ী হতে পারে এবং বিমূর্ততার কারণে, বেশ ভুল। পাশাপাশি, আরসি বনাম এমআরসি একটি বড় পার্থক্য করতে পারে।

সুতরাং আসুন ফিরে আসি, সম্পত্তি অ্যাক্সেসগুলি বাস্তবায়নের দিকে মনোনিবেশ না করে আমরা সাধারণ সন্দেহভাজনদেরকে অন্তর্ভুক্ত করব objc_msgSendএবং একটি কলকে কল করার জন্য কিছু বাস্তব-বিশ্বের উচ্চ-স্তরের ফলাফলগুলি পরীক্ষা করবNSString এবং অবিসংবাদিত ক্ষেত্রে (প্রাপ্ত প্রতি সেকেন্ডের মান) :

  • এমআরসি | ননোটমিক | ম্যানুয়ালি প্রয়োগিত প্রাপ্তরা: 2
  • এমআরসি | ননোটমিক | সংশ্লেষিত গেটর: 7
  • এমআরসি | পারমাণবিক | সংশ্লেষিত গেটর: 47
  • এআরসি | ননোটমিক | সংশ্লেষিত গেটর: 38 (দ্রষ্টব্য: এআরসি'র রেফার গণনা এখানে সাইকেল চালানো)
  • এআরসি | পারমাণবিক | সংশ্লেষিত গেটর: 47

আপনি সম্ভবত অনুমান করেছেন, রেফারেন্স গণনা ক্রিয়াকলাপ / সাইক্লিং এটমিক্সের সাথে এবং এআরসি এর আওতায় গুরুত্বপূর্ণ অবদানকারী। আপনি প্রতিদ্বন্দ্বিত মামলায় আরও বেশি পার্থক্য দেখতে পাবেন।

যদিও আমি পারফরম্যান্সের দিকে গভীর মনোযোগ দিই, তবুও আমি সেমেন্টিক্স ফার্স্ট! । এদিকে, অনেক প্রকল্পের জন্য পারফরম্যান্স একটি নিম্ন অগ্রাধিকার। তবে, কার্যকরভাবে প্রয়োগের বিবরণ এবং আপনি যে প্রযুক্তি ব্যবহার করেন সেগুলি ব্যয় করে অবশ্যই ক্ষতি করে না। আপনার প্রয়োজন, উদ্দেশ্য এবং দক্ষতার জন্য আপনার সঠিক প্রযুক্তি ব্যবহার করা উচিত। আশা করি এটি আপনার কয়েক ঘন্টা তুলনা বাঁচাবে এবং আপনার প্রোগ্রামগুলি ডিজাইন করার সময় আপনাকে আরও ভালভাবে সিদ্ধান্ত নিতে সহায়তা করবে।


এমআরসি | পারমাণবিক | সংশ্লেষিত গেটর: 47 আরসি | পারমাণবিক | সংশ্লেষিত গেটর: 47 কী তাদের একই করে? এআরসি আরও ওভারহেড থাকা উচিত নয়?
এসডিইজেরো

2
সুতরাং যদি পারমাণবিক বৈশিষ্ট্যগুলি খারাপ হয় তবে তারা ডিফল্ট। বয়লারপ্লেট কোড বাড়ানোর জন্য?
কুণাল বালানী

@ শিখুন কোকোস 2 ডি আমি একই মেশিনে 10.8 লক্ষ্য করে পরীক্ষিত হয়েছি, 10.8 লক্ষ্যবস্তু করে, একক থ্রেডযুক্ত বিনা প্রতিযোগিতা ক্ষেত্রে 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
জাস্টিন

অনলাইনে কোথাও আপনার এই পরীক্ষা আছে? আমি এখানে আমার যোগ করে চলেছি
শিখুন

@ শেখা কোকোস 2 ডি আমি তাদের মানব সেবার জন্য প্রস্তুত করি নি, দুঃখিত।
জাস্টিন

95

পারমাণবিক = থ্রেড সুরক্ষা

অ পারমাণবিক = কোনও থ্রেড সুরক্ষা নয়

থ্রেড সুরক্ষা:

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

আমাদের প্রসঙ্গে:

যদি কোনও থ্রেড উদাহরণের মান পরিবর্তন করে তবে পরিবর্তিত মানটি সমস্ত থ্রেডের জন্য উপলব্ধ এবং এক সময় কেবলমাত্র একটি থ্রেড মান পরিবর্তন করতে পারে।

কোথায় ব্যবহার করতে হবে atomic :

উদাহরণের পরিবর্তনশীলটি যদি বহুবিবাহিত পরিবেশে অ্যাক্সেস করা যায়।

এর অর্থে atomic:

তত দ্রুত নয় nonatomicকারণ nonatomicরানটাইম থেকে কোনও ওয়াচডগ কাজের প্রয়োজন নেই।

কোথায় ব্যবহার করবেনnonatomic :

যদি উদাহরণের পরিবর্তনশীলটি একাধিক থ্রেড দ্বারা পরিবর্তন করা না হয় আপনি এটি ব্যবহার করতে পারেন। এটি কর্মক্ষমতা উন্নত করে।


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

3
@ জো ব্লো এটি সত্য যে আপনি এটি যাচাই করতে পারেন এখানে এটি বিকাশকারী.এপ্লে.লাইবারি
ম্যাক / ডকুমেন্টেশন / কোকো / কনসেপ্টুয়াল /

1
দুরাই, এফডাব্লুআইডাব্লু, যে লিঙ্কটি আপনার "পরমাণু = থ্রেড সুরক্ষা" এর থিসিসের সাথে সরাসরি বিরোধিতা করে। ডকটিতে অ্যাপল স্পষ্টতই বলেছে, "সম্পত্তির পারমাণবিকতা কোনও সামগ্রীর থ্রেড সুরক্ষার সমার্থক নয়” " অনুশীলনে, পরমাণু থ্রেড সুরক্ষা অর্জনের জন্য খুব কমই যথেষ্ট।
রব

69

আমি পারমাণবিক এবং অ পারমাণবিক বৈশিষ্ট্য একটি প্রশংসনীয় ভাল করা ব্যাখ্যা পাওয়া এখানে । এখানে থেকে কিছু প্রাসঙ্গিক পাঠ্য:

'পারমাণবিক' অর্থ এটি ভেঙে ফেলা যায় না। ওএস / প্রোগ্রামিং শর্তে একটি পারমাণবিক ফাংশন কল এমন হয় যা বাধা দেওয়া যায় না - পুরো ফাংশনটি সম্পাদন করতে হবে, এবং সিএসইউ থেকে ওএসের স্বাভাবিক প্রসঙ্গটি স্যুইচিং না হওয়া পর্যন্ত এটি সম্পূর্ণ না হওয়া পর্যন্ত। কেবলমাত্র আপনি জানেন না: যেহেতু একবারে সিপিইউ কেবল একটি কাজ করতে পারে, তাই ওএস সিপিইউতে অ্যাক্সেসটি সামান্য সময়-স্লাইসে চলমান সমস্ত প্রসেসে ঘুরিয়ে দেয়, মায়া দেয়মাল্টিটাস্কিং এর। সিপিইউ শিডিয়ুলার তার কার্য সম্পাদনের যে কোনও সময়ে কোনও প্রক্রিয়া - এমনকি মিড ফাংশন কলেও বাধা দিতে পারে। সুতরাং ভাগ হওয়া কাউন্টার ভেরিয়েবলগুলি আপডেট করার মতো ক্রিয়াকলাপের জন্য যেখানে দুটি প্রক্রিয়া একই সময়ে ভেরিয়েবলটি আপডেট করার চেষ্টা করতে পারে, তাদের অবশ্যই 'পরমাণু' কার্যকর করতে হবে, অর্থাত, অন্য কোনও প্রক্রিয়াটি অদলবদল করার আগে প্রতিটি আপডেট ক্রিয়াকে সম্পূর্ণরূপে শেষ করতে হবে সিপিইউ.

সুতরাং আমি অনুমান করে থাকব যে এক্ষেত্রে পারমাণবিক অর্থ অ্যাট্রিবিউট রিডার পদ্ধতিগুলিকে বাধা দেওয়া যাবে না - ফলস্বরূপ অর্থ যে পদ্ধতি দ্বারা পড়া ভেরিয়েবলগুলি তাদের মানটিকে অর্ধেক পথ পরিবর্তন করতে পারে না কারণ কিছু অন্যান্য থ্রেড / কল / ফাংশন পায় সিপিইউতে বদলানো।

কারণ atomicভেরিয়েবলগুলি বাধা দেওয়া যায় না, যে কোনও বিন্দুতে তাদের দ্বারা থাকা মান হ'ল (থ্রেড-লক) নিরবচ্ছিন্ন হওয়ার গ্যারান্টিযুক্ত , যদিও, এই থ্রেড লকটি নিশ্চিত করে তাদের অ্যাক্সেসকে ধীর করে তোলে। non-atomicঅন্যদিকে ভেরিয়েবলগুলি এ জাতীয় কোনও গ্যারান্টি না দেয় তবে দ্রুত অ্যাক্সেসের বিলাসিতা সরবরাহ করে। এটি সংক্ষেপে, non-atomicযখন আপনি জানেন যে আপনার ভেরিয়েবলগুলি একসাথে একাধিক থ্রেড দ্বারা অ্যাক্সেস করা হবে না এবং জিনিসগুলি গতি বাড়িয়ে তুলবে with


1
লিঙ্কটি নষ্ট হয়ে গেছে। ;
রব

লিঙ্কগুলির সাথে এটিই সমস্যা :( ভাগ্যক্রমে, আমি আমার উত্তরে প্রাসঙ্গিক পাঠ্যটি উদ্ধৃত করেছি
tipycalFlow

67

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

  1. atomic // ডিফল্ট
  2. nonatomic
  3. strong = retain // ডিফল্ট
  4. weak = unsafe_unretained
  5. retain
  6. assign // ডিফল্ট
  7. unsafe_unretained
  8. copy
  9. readonly
  10. readwrite // ডিফল্ট

নিবন্ধে ভেরিয়েবল সম্পত্তি বৈশিষ্ট্য বা আইওএসে সংশোধক আপনি উপরে উল্লিখিত সমস্ত বৈশিষ্ট্যগুলি খুঁজে পেতে পারেন এবং এটি অবশ্যই আপনাকে সহায়তা করবে।

  1. atomic

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

    উদাহরণ:

        @property (retain) NSString *name;
    
        @synthesize name;
  2. nonatomic

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

    উদাহরণ:

        @property (nonatomic, retain) NSString *name;
    
        @synthesize name;

কীভাবে বরাদ্দ করা যায় এবং শক্তিশালী / ধরে রাখা উভয়ই ডিফল্ট হতে পারে?
BangOperator

এআরসি নিয়ে শক্তিশালী আসে, এআরসি-র পূর্বে ধরে রাখা পূর্বনির্ধারিত ছিল
আবদুল্লাহসেলেক

56

পারমাণবিক:

পারমাণবিক গ্যারান্টি দেয় যে সম্পত্তিটিতে অ্যাক্সেস একটি পারমাণবিক পদ্ধতিতে সঞ্চালিত হবে। উদাহরণস্বরূপ, এটি সর্বদা সম্পূর্ণ সূচনাপ্রাপ্ত বস্তুগুলি ফেরত দেয়, অন্য কোনও থ্রেডে প্রবেশের আগে কোনও থ্রেডে কোনও সম্পত্তির প্রাপ্ত / সেট সম্পূর্ণ করতে হবে।

যদি আপনি কল্পনা করেন যে নীচের ফাংশনটি একবারে দুটি থ্রেডে ঘটছে তবে আপনি দেখতে পাচ্ছেন যে ফলাফলগুলি কেন সুন্দর হবে না।

-(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

অ-পরমাণু:

পারমাণবিক থেকে পৃথক, এটি প্রতিবার পুরোপুরি আরম্ভকৃত বস্তুর রিটার্ন নিশ্চিত করে না।

পেশাদাররা: অত্যন্ত দ্রুত কার্যকর করা।

কনস: মাল্টি-থ্রেডিংয়ের ক্ষেত্রে আবর্জনা মানের সম্ভাবনা।


5
এই মন্তব্যটি খুব একটা বোঝায় না। আপনি কি স্পষ্ট করতে পারেন? আপনি যদি অ্যাপলের সাইটে উদাহরণগুলি দেখুন তবে পরমাণু কীওয়ার্ডটি তার বৈশিষ্ট্যগুলি আপডেট করার সময় অবজেক্টে সিঙ্ক্রোনাইজ করে।
অ্যান্ড্রু গ্রান্ট

52

সবচেয়ে সহজ উত্তর: আপনার দ্বিতীয় দুটি উদাহরণের মধ্যে কোনও পার্থক্য নেই। ডিফল্টরূপে, সম্পত্তি অ্যাক্সেসরগুলি পারমাণবিক।

কোনও আবর্জনা সংগৃহীত পরিবেশে পারমাণবিক অ্যাক্সেসরগুলি (যেমন ধরে রাখতে / রিলিজ / অটোরিলেজ ব্যবহার করার সময়) অন্য একটি থ্রেডটি মানটির সঠিক সেটিং / প্রাপ্তিতে হস্তক্ষেপ না করে তা নিশ্চিত করতে একটি লক ব্যবহার করবে।

মাল্টি-থ্রেডেড অ্যাপস তৈরি করার সময় আরও কিছু তথ্যের জন্য এবং অন্যান্য বিবেচনার জন্য অ্যাপলের উদ্দেশ্য-সি 2.0 ডকুমেন্টেশনের " পারফরম্যান্স এবং থ্রেডিং " বিভাগটি দেখুন।


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


31

পারমাণবিক অর্থ শুধুমাত্র একটি থ্রেড চলক (স্থির প্রকার) অ্যাক্সেস করে। পারমাণবিক থ্রেড-নিরাপদ তবে ধীর।

ননোটমিকের অর্থ একাধিক থ্রেডগুলি চলক (গতিশীল প্রকার) অ্যাক্সেস করে। ননোটমিক থ্রেড-অনিরাপদ তবে এটি দ্রুত।


14

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

এটি কেবল থ্রেড সুরক্ষার নিশ্চয়তা দেয়; এটি গ্যারান্টি দেয় না আমার অর্থ হ'ল আপনি নিজের গাড়ির জন্য একজন বিশেষজ্ঞ ড্রাইভার ভাড়া রাখেন, তবুও এটি গ্যারান্টি দেয় না যে গাড়ী কোনও দুর্ঘটনা ঘটবে না। তবে সম্ভাবনা সামান্যতম থেকে যায় remains

পারমাণবিক - এটি ভেঙে ফেলা যায় না, সুতরাং ফলাফলটি প্রত্যাশিত। ননোটমিকের সাথে - যখন অন্য থ্রেড মেমোরি জোনে অ্যাক্সেস করে এটি এটিকে সংশোধন করতে পারে, ফলে ফলাফলটি অপ্রত্যাশিত।

কোড টক:

পারমাণবিক সম্পত্তির থ্রেডের গিটার এবং সেটার নিরাপদ। উদাহরণস্বরূপ যদি আপনি লিখেছেন:

self.myProperty = value;

থ্রেড নিরাপদ।

[myArray addObject:@"Abc"] 

থ্রেড নিরাপদ নয়।


আমি জানি না যে শেষ অনুচ্ছেদটি কীভাবে আসে তবে এটি সাধারণ ভুল, "ব্যক্তিগত অনুলিপি" এর মতো কোনও জিনিস নেই।
শিখর

13

"পারমাণবিক" তেমন কোনও কীওয়ার্ড নেই

@property(atomic, retain) UITextField *userName;

আমরা উপরের মত ব্যবহার করতে পারেন

@property(retain) UITextField *userName;

স্ট্যাক ওভারফ্লো প্রশ্ন দেখুন আমি @ প্রপার্টি (পারমাণবিক, ধরে রাখা) এনএসএসস্ট্রিং * মাই স্ট্রিং ব্যবহার করলে আমি সমস্যাগুলি পাচ্ছি


10
"এই জাতীয় কীওয়ার্ড রয়েছে", মূল শব্দটি ডিফল্টরূপে প্রয়োজন হয় না এবং এমনকি ডিফল্ট মান মানে কীওয়ার্ডের অস্তিত্ব থাকে না।
ম্যাথিজ্ন

4
এটি ভুল। মূলশব্দটি বিদ্যমান নেই। এই উত্তরটি বিভ্রান্তিমূলক, এবং আমি এটিকে নামাতে উত্সাহিত করব।
sethfri

12

পারমাণবিক (ডিফল্ট)

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

nonatomic

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

এখানে আরও দেখুন: https://realm.io/news/tmi-objective-c-property-attributes/


11

ডিফল্ট হল 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 টি ভিন্ন থ্রেড সহ, এটিও ভেঙে যেতে পারে!


10

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

প্রথমে এই প্রশ্নটি পড়ুন এবং তারপরে বুবুমের উত্তরটি পড়ুন । এছাড়াও, তারপরে আমার সারাংশটি পড়ুন।


atomic সবসময় গ্যারান্টি দেবে

  • যদি দুটি ভিন্ন ব্যক্তি একই সাথে পড়তে এবং লিখতে চান তবে আপনার কাগজটি কেবল জ্বলবে না! -> আপনার অ্যাপ্লিকেশন কখনই কোনও ক্রাশ হবে না, এমনকি দৌড়ঝাঁপ অবস্থায়।
  • যদি কোনও ব্যক্তি লেখার চেষ্টা করছেন এবং লিখার জন্য 8 টি বর্ণের মধ্যে কেবল 4 টি লিখেছেন, তবে কেউ মাঝখানে পড়তে পারবেন না, পাঠ কেবল তখনই করা যাবে যখন সমস্ত 8 টি অক্ষর লেখা হয় -> কোনও পঠন (পাওয়া) হবে না 'একটি থ্রেড যা এখনও লিখছে', অর্থাত্ যদি লিখতে হয় বাইট থেকে 8 টি বাইট, এবং কেবল 4 বাইট লেখা থাকে that এই মুহূর্ত পর্যন্ত, আপনাকে এটি থেকে পড়তে দেওয়া হবে না। তবে যেহেতু আমি বলেছিলাম এটি ক্রাশ হবে না তখন এটি একটি স্বতঃস্ফূর্ত অবজেক্টের মান থেকে পড়বে
  • তাহলে সামনে লেখা আপনি আছে মুছে যা পূর্বে কাগজে লেখা হয়েছিল এবং তারপর কেউ আপনাকে পড়তে চায় করতে এখনো পড়া। কিভাবে? আপনি ম্যাক ওএস ট্র্যাশ বিনের অনুরূপ কিছু থেকে পড়বেন (যেমন ট্র্যাশ বিন এখনও 100% মুছে ফেলা হচ্ছে না ... এটি একটি লিম্বোতে রয়েছে) ---> থ্রেডবি যদি পড়তে হয় তবে থ্রেডবি ইতিমধ্যে লিখতে অস্বীকৃতি জানিয়েছে, আপনি পাবেন থ্রেডবি দ্বারা চূড়ান্তভাবে সম্পূর্ণরূপে লিখিত মান থেকে একটি মান বা অটোরিলিজ পুল থেকে কিছু পান।

অবটেন-সি-তে মেমরি পরিচালনা করার পদ্ধতিটিই পুনরায় রাখুন। আপনি যখন কোনও বস্তু তৈরি করেন, এটির একটি রক্ষণ গণনা থাকে ১। আপনি যখন কোনও বস্তুকে একটি রক্ষণাবেক্ষণ বার্তা প্রেরণ করেন, তখন তার ধরে রাখার গণনাটি ১ দ্বারা বাড়ানো হয় you যখন আপনি কোনও বস্তুকে একটি মুক্তির বার্তা প্রেরণ করেন, তখন তার ধরে রাখার গণনা হ্রাস পাবে যখন আপনি কোনও বস্তুকে একটি স্বতঃপ্রকাশ বার্তা প্রেরণ করুন , ভবিষ্যতে কোনও পর্যায়ে এর ধরে রাখার সংখ্যা 1 দ্বারা হ্রাস পেয়েছে। যদি কোনও অবজেক্টের ধরে রাখার গণনা 0 টি হ্রাস করা হয় তবে তা নির্বিঘ্ন হয়।

  • পরমাণু থ্রেড সুরক্ষার জন্য গ্যারান্টি দেয় না , যদিও এটি থ্রেড সুরক্ষা অর্জনের জন্য দরকারী। থ্রেড সুরক্ষা আপনি কীভাবে আপনার কোডটি লিখছেন / কোন থ্রেডের সারি আপনি পড়ছেন / লিখছেন তার সাথে সম্পর্কিত। এটি কেবল ক্র্যাশযোগ্য নয় বহুগঠনের জন্য গ্যারান্টি দেয়।

কি?! মাল্টিথ্রেডিং এবং থ্রেড সুরক্ষা আলাদা?

হ্যাঁ. মাল্টিথ্রেডিংয়ের অর্থ: একাধিক থ্রেড একই সাথে ডেটা ভাগ করা অংশ পড়তে পারে এবং আমরা ক্রাশ করব না, তবুও এটি কোনও গ্যারান্টি দেয় না যে আপনি একটি স্ব-স্বাবলম্বিত মান থেকে পড়ছেন না। থ্রেড সুরক্ষার সাথে এটির নিশ্চয়তা রয়েছে যে আপনি যা পড়েছেন তা স্বয়ংক্রিয়ভাবে প্রকাশিত হয় না। আমরা ডিফল্টরূপে সমস্ত কিছুকে পারমাণবিক না করার কারণ হ'ল, এখানে একটি পারফরম্যান্স ব্যয় হয় এবং বেশিরভাগ জিনিসের জন্য সত্যই থ্রেড সুরক্ষার প্রয়োজন হয় না। আমাদের কোডের কয়েকটি অংশের এটির প্রয়োজন এবং সেই কয়েকটি অংশের জন্য, আমাদের লকস, মিউটেক্স বা সিঙ্ক্রোনাইজেশন ব্যবহার করে থ্রেড-নিরাপদে আমাদের কোডটি লিখতে হবে।


nonatomic

  • যেহেতু ম্যাক ওএস ট্র্যাশ বিনের মতো কোনও জিনিস নেই, তাই আপনি সর্বদা একটি মূল্য পান কিনা সে সম্পর্কে কেউই পাত্তা দেয় না (<- এটি সম্ভাব্যরূপে ক্র্যাশ হতে পারে) এবং কেউ আপনার লেখার মধ্য দিয়ে অর্ধেক পঠন করার চেষ্টা করে কিনা সেদিকেও নজর নেই although অর্ধেক স্মৃতিতে লেখা কাগজের উপর অর্ধেক লেখার চেয়ে অনেক আলাদা, স্মৃতিতে এটি আপনাকে আগে থেকে একটি ক্রেতী মূ value় মান দিতে পারে, যখন কাগজে আপনি কেবল যা লেখা হয়েছে তার অর্ধেকটি দেখতে পান) -> ক্র্যাশ না হওয়ার গ্যারান্টি দেয় না কারণ এটি অটোরিলেজ মেকানিজম ব্যবহার করে না।
  • সম্পূর্ণ লিখিত মান পড়ার গ্যারান্টি দেয় না!
  • পারমাণবিক চেয়ে দ্রুত

সামগ্রিকভাবে তারা 2 দিক থেকে পৃথক:

  • অটোরিলেজ পুল থাকার বা না থাকার কারণে ক্রাশ বা না হওয়া।

  • একটি 'এখনও সমাপ্ত লেখা বা খালি মান' এর মাঝখানে পড়তে দেওয়া বা মানটি সম্পূর্ণরূপে লেখার সময় কেবল অনুমতি দেওয়ার অনুমতি না দেওয়া এবং পড়ার অনুমতি দেওয়া ।


9

আপনি যদি নিজের সম্পত্তিটিকে বহু-থ্রেডযুক্ত কোডে ব্যবহার করছেন তবে আপনি ননোটমিক এবং পারমাণবিক বৈশিষ্ট্যের মধ্যে পার্থক্য দেখতে সক্ষম হবেন। ননোটমিক পারমাণবিকের চেয়ে দ্রুত এবং পারমাণবিক থ্রেড-নিরাপদ, ননোটমিক নয়।

বিজয়েন্দ্র ত্রিপাঠি ইতিমধ্যে বহু-থ্রেড পরিবেশের জন্য একটি উদাহরণ দিয়েছেন।


9
  • -আটমিক মানে শুধুমাত্র একটি থ্রেড অ্যাক্সেস ভেরিয়েবল (স্ট্যাটিক টাইপ) অ্যাক্সেস করে।
  • -অ্যাটমিক থ্রেড নিরাপদ।
  • -কিন্তু এটি কর্মক্ষমতা মধ্যে ধীর

কীভাবে ঘোষণা করবেন:

যেমন পারমাণবিক ডিফল্ট তাই,

@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 হয় তারপর

  • এটি A এর জন্য "দত্ত" মান প্রদান করবে
  • এটি বি এর জন্য "দত্ত" মান প্রদান করবে

কেন অ পারমাণবিককে থ্রেডকে অনিরাপদ বলা হয় তবে এটি সমান্তরাল সম্পাদনের কারণে কার্য সম্পাদনে দ্রুত

এখন যদি * নামের সম্পত্তিটি পারমাণবিক হয়

  • এটি এ এর ​​জন্য "সৌরভ" এর মান নিশ্চিত করবে
  • তারপরে এটি বি এর জন্য "দত্ত" মান প্রদান করবে

এ কারণেই পারমাণবিককে থ্রেড নিরাপদ বলা হয় এবং এ কারণেই এটিকে রিড-রাইট নিরাপদ বলা হয়

এই ধরনের পরিস্থিতি অপারেশন সিরিয়ালি সম্পাদন করবে। এবং কর্মক্ষমতা ধীর

- ননোটমিক মানে একাধিক থ্রেড অ্যাক্সেস ভেরিয়েবল (ডায়নামিক টাইপ)।

- ননঅ্যাটমিক থ্রেড অনিরাপদ।

- তবে এটি পারফরম্যান্সে দ্রুত

-নোটমিক হ'ল ডিফল্ট আচরণ নয়, আমাদের সম্পত্তি বৈশিষ্ট্যে ননোটমিক কীওয়ার্ড যুক্ত করতে হবে।

ইন সুইফ্ট নিশ্চিতকরণের জন্য যে ওবিজেসি অর্থে সুইফ্ট বৈশিষ্ট্যগুলি অসাধারণ। একটি কারণ হ'ল প্রতি-সম্পত্তি পারমাণবিকতা আপনার প্রয়োজনের জন্য যথেষ্ট কিনা তা নিয়ে আপনি ভাবেন।

তথ্যসূত্র: https://forums.developer.apple.com/thread/25642

ইতস্তত আরও তথ্যের দয়া করে ওয়েবসাইট ভিজিট করুন http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html


4
হিসাবে অনেক অনেক অনেক maaaaany অন্যদের বলেছি, atomicহয় না থ্রেড-নিরাপদ! এটি থ্রেড সমস্যার প্রতিরোধী তবে থ্রেড-নিরাপদ নয়। এটি কেবল নিশ্চিত করে যে আপনি পুরো মানটি পেয়ে যাবেন, যেমন একটি "সঠিক" মান (বাইনারি স্তর), তবে কোনওভাবেই এটি নিশ্চিত করবে না যে এটি আপনার ব্যবসায়ের যুক্তির জন্য বর্তমান এবং "সঠিক" মান (এটি অতীতের মান হতে পারে এবং আপনার যুক্তি দ্বারা অবৈধ)।
আলেজান্দ্রো ইভান

6

পারমাণবিক পরমাণু (ডিফল্ট)

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

nonatomic

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

সৌজন্য https://academy.realm.io/posts/tmi-objective-c-property-attributes/

পারমাণবিক সম্পত্তি বৈশিষ্ট্য (পারমাণবিক এবং ননোটমিক) সম্পর্কিত সুইফট সম্পত্তি সম্পর্কিত ঘোষণায় প্রতিফলিত হয় না, তবে সুইফট থেকে আমদানিকৃত সম্পত্তি অ্যাক্সেস করা হলে অবজেক্টিভ-সি বাস্তবায়নের পারমাণবিকতা গ্যারান্টি এখনও বহাল থাকে।

সুতরাং - আপনি যদি উদ্দেশ্য-সি-তে কোনও পারমাণবিক সম্পত্তি সংজ্ঞায়িত করেন তবে সুইফট যখন ব্যবহার করবেন এটি পরমাণু থেকে যাবে।

সৌজন্য https://medium.com/@YogevSitton/atomic-vs-non-atomic-properties-crash-course-d11c23f4366c


5

পারমাণবিক সম্পত্তি কতগুলি থ্রেড এতে গেটর এবং সেটার করছে তা নির্বিশেষে পুরোপুরি প্রাথমিক মানের মান ধরে রাখতে নিশ্চিত করে।

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


3

পারমাণবিক অর্থ শুধুমাত্র একটি থ্রেড একবারে পরিবর্তনশীল অ্যাক্সেস করতে পারে (স্ট্যাটিক টাইপ)। পারমাণবিক থ্রেড-নিরাপদ তবে ধীর।

ননোটমিকের অর্থ একাধিক থ্রেড একই সময়ে পরিবর্তনশীল অ্যাক্সেস করতে পারে (গতিশীল প্রকার)। ননোটমিক থ্রেড-অনিরাপদ তবে এটি দ্রুত।


1

আপনি যদি পারমাণবিক ব্যবহার করেন তবে এর অর্থ থ্রেডটি নিরাপদ এবং কেবল পঠনযোগ্য। যদি আপনি নন্যাটমিক ব্যবহার করছেন তবে এর অর্থ হল একাধিক থ্রেডগুলি পরিবর্তনশীল অ্যাক্সেস করে এবং থ্রেডটি অনিরাপদ, তবে এটি দ্রুত কার্যকর হয়, একটি পঠন এবং লিখন অপারেশন সম্পন্ন হয়; এটি একটি গতিশীল টাইপ।


1

সত্যটি হ'ল তারা পারমাণবিক সম্পত্তি প্রয়োগের জন্য স্পিন লক ব্যবহার করে। নীচের মত কোড:

 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);
    }

0

সম্পূর্ণ বিভ্রান্তি সরল করতে, আসুন আমরা মুটেক্স লকটি বুঝতে পারি।

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

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


-1

পারমাণবিক: এনএসলক ব্যবহার করে থ্রেড লক করে থ্রেড-সুরক্ষা নিশ্চিত করুন।

অ পরমাণু: থ্রেড-লকিংয়ের কোনও ব্যবস্থা না থাকায় থ্রেড-সুরক্ষা নিশ্চিত করে না।


-1

পারমাণবিক বৈশিষ্ট্য : - যখন পারমাণবিক সম্পত্তির সাথে নির্ধারিত কোনও চলকটির অর্থ এটির কেবল একটি থ্রেড অ্যাক্সেস থাকে এবং এটি থ্রেড নিরাপদ হবে এবং পারফরম্যান্সের দৃষ্টিকোণে ভাল হবে, তখন ডিফল্ট আচরণ থাকবে।

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

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