කුමක් 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;
මෙම තිදෙනා අතර මෙහෙයුම් වෙනස කුමක්ද?
Answers:
අන්තිම දෙක සමාන ය; "පරමාණුක" යනු පෙරනිමි හැසිරීමයි ( එය ඇත්ත වශයෙන්ම මූල පදයක් නොවන බව සලකන්න; එය නිශ්චිතව දක්වා ඇත්තේ - nonatomic
atomic
llvm / clang හි මෑත සංස්කරණවල මූල පදයක් ලෙස එකතු කර තිබීම).
ඔබ ක්රමවේදය ක්රියාත්මක කිරීම සංස්ලේෂණය කරන බව උපකල්පනය කරමින්, පරමාණුක එදිරිව පරමාණුක නොවන උත්පාදක කේතය වෙනස් කරයි. ඔබ ඔබේම කට්ටලයක් / ලබා ගන්නන් ලියන්නේ නම්, පරමාණුක / පරමාණුක / රඳවා තබා ගැනීම / පැවරීම / පිටපත හුදෙක් උපදේශාත්මක වේ. (සටහන: @synthesize දැන් LLVM මෑතකදී නිකුත් වූ සංස්කරණයන් හි සැකසුම් හැසිරීම වේ ප්රකාශ උදාහරණයක් විචල්ය කිරීමට කිසිදු අවශ්යතාවක් ද පවතී, ඔවුන් ද, ස්වයංක්රීයව සංස්ලේෂණය කරනු ඇත, හා ගනු ඇත. _
හදිසි අනතුරු සෘජු ප්රවේශ වැළැක්වීම සඳහා ඔවුන්ගේ නම prepended).
“පරමාණුක” සමඟ, සංස්ලේෂණය කරන ලද සැකසුම්කරු / ලබා ගන්නා තැනැත්තා වෙනත් ඕනෑම ත්රෙඩ් එකක සැකසුම් ක්රියාකාරකම් නොසලකා සම්පූර්ණ අගය සැමවිටම ලබා ගන්නාගෙන් හෝ සෙටර් විසින් සකසා ඇති බව සහතික කරයි . එනම්, නූල් A ලබා ගන්නා තැනැත්තාගේ මැද නම්, B නූල් සෙටරය අමතන්නේ නම්, සත්ය ශක්ය අගයක් - ස්වයංක්රීයව මුදා හරින ලද වස්තුවක්, බොහෝ දුරට - A හි අමතන්නා වෙත ආපසු ලබා දෙනු ඇත.
තුළ nonatomic
, එවැනි සහතික කිරීම් නොමැත. මේ අනුව, nonatomic
"පරමාණුක" ට වඩා සැලකිය යුතු වේගයකින් යුක්ත වේ.
කුමක්ද "පරමාණුක" නැහැ නැහැ නැහැ නූල් ආරක්ෂාව ගැන කිසිදු සහතික කරන්න වේ. A සහ නූල් B සහ C නූල් සමඟ එකවරම විවිධ අගයන් සහිත සෙටරය අමතන්නේ නම්, නූල් A මඟින් අගයන් තුනෙන් එකක් ආපසු ලබා ගත හැකිය - ඕනෑම සැකසුම් කැඳවීමට පෙර හෝ අගයන්ගෙන් එකක් හෝ කට්ටල තුළට යවනු ලැබේ. ඒ හා සමානව, වස්තුව B හෝ C වලින් ලැබෙන අගය සමඟ අවසන් විය හැකිය.
දත්තවල අඛණ්ඩතාව සහතික කිරීම - බහු-නූල් ක්රමලේඛනයේ මූලික අභියෝගවලින් එකක් - වෙනත් ක්රම මගින් සාක්ෂාත් කරගනු ලැබේ.
මෙයට එකතු කිරීම:
atomicity
බහුවිධ යැපෙන දේපල ක්රියාත්මක වන විට තනි දේපලකට නූල් ආරක්ෂාව සහතික කළ නොහැක.
සලකා බලන්න:
@property(atomic, copy) NSString *firstName;
@property(atomic, copy) NSString *lastName;
@property(readonly, atomic, copy) NSString *fullName;
මෙම අවස්ථාවෙහිදී, නූල් A යනු වස්තුව නැවත නම් කිරීම setFirstName:
හා ඇමතීම විය setLastName:
හැකිය. මේ අතර, නූල් fullName
A හි ඇමතුම් දෙක අතරට නූල් B ඇමතිය හැකි අතර පැරණි මුල් නම සමඟ නව මුල් නම ලැබෙනු ඇත.
මෙය විසඳීම සඳහා ඔබට ගනුදෙනු ආකෘතියක් අවශ්ය වේ. එනම් වෙනත් ආකාරයක සමමුහුර්තකරණය සහ / හෝ බැහැර කිරීම මඟින් fullName
යැපෙන ගුණාංග යාවත්කාලීන වන විට කෙනෙකුට ප්රවේශය බැහැර කළ හැකිය .
@property NSArray* astronomicalEvents;
UI හි පෙන්වීමට අවශ්ය දත්ත ලැයිස්තුගත කර ඇත. යෙදුම මඟින් දර්ශකය හිස් අරාවකට යොමු කරන විට, යෙදුම වෙබයෙන් දත්ත ඇද ගනී. වෙබ් ඉල්ලීම සම්පුර්ණ වූ විට (වෙනත් ත්රෙඩ් එකකින්) යෙදුම නව අරාවක් ගොඩනඟා පරමාණුකව දේපල නව දර්ශක අගයකට සකසයි. එය නූල් ආරක්ෂිත වන අතර මට යමක් මග හැරී ඇත්නම් මිස මට කිසිදු අගුලු දැමීමේ කේතයක් ලිවීමට අවශ්ය නොවීය. මට ගොඩක් ප්රයෝජනවත් බව පෙනේ.
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_;
}
}
මූලික වශයෙන්, පරමාණුක අනුවාදයට නූල්වල ආරක්ෂාව සහතික කිරීම සඳහා අගුලක් ගත යුතු අතර, වස්තුව මත ref ගණනය කිරීම (සහ එය සමතුලිත කිරීම සඳහා ස්වයංක්රීය මුදාහැරීමේ ගණන) වැඩි කරයි, එවිට වස්තුව ඇමතුම්කරුට පවතින බවට සහතික වේ. වෙනත් ත්රෙඩ් එකක් අගය සකසන්නේ නම් එය විභව ධාවන තත්වයකි, එමඟින් ref ගණන 0 දක්වා පහත වැටේ.
ගුණාංග පරිමාණ අගයන් හෝ වස්තූන් ද යන්න මත පදනම්ව මේවා ක්රියා කරන ආකාරය සහ රඳවා තබා ගැනීම, පිටපත් කිරීම, කියවීමට පමණක්, පරමාණුක නොවන යනාදිය මත පදනම්ව විවිධ ප්රභේද විශාල සංඛ්යාවක් ඇත. පොදුවේ ගත් කල, දේපල සංස්ෙල්ෂක සියල්ලම සියලු සංයෝජනයන් සඳහා "නිවැරදි දේ" කරන්නේ කෙසේදැයි දනී.
@property (assign) id delegate;
කිසිවක් මත සමමුහුර්ත කර නොමැත (iOS SDK GCC 4.2 ARM -Os
), එයින් අදහස් වන්නේ [self.delegate delegateMethod:self];
සහ අතර තරඟයක් පවතින foo.delegate = nil; self.foo = nil; [super dealloc];
බවයි. Stackoverflow.com/questions/917884/…
_val
/ මොකක්ද කියලා val
, නමුත් නැහැ, ඇත්තටම නැහැ. පරමාණුක copy
/ retain
දේපළක් ලබා ගන්නා තැනැත්තා වෙනත් ත්රෙඩ් එකකින් ඇමතුම කැඳවීම නිසා එය නැවත ගණනය කිරීම ශුන්ය වන වස්තුවක් ආපසු නොඑන බවට සහතික විය යුතුය, එයින් මූලික වශයෙන් අදහස් කරන්නේ එය ඇත්දළ කියවිය යුතු බවත්, එය රඳවා තබා ගන්නා බවත් සහතික කර ඇති බවත්ය. එය නැවත ලිවීම සහ මුදා හැරීම, පසුව රඳවා තබා ගැනීම සමතුලිත කිරීම සඳහා එය ස්වයංක්රීයව මුදා හැරීම. එහි අර්ථය වන්නේ ලබා ගන්නා තැනැත්තා සහ සැකසුම්කරු යන දෙදෙනාම අගුලක් භාවිතා කළ යුතු බවයි (මතක පිරිසැලසුම සවි කර ඇත්නම් එය CAS2 උපදෙස් සමඟ කළ හැකි ය; අහෝ -retain
ක්රමවේදය ඇමතුමකි ).
වෙනස තේරුම් ගැනීමට ඇති හොඳම ක්රමය පහත උදාහරණය භාවිතා කිරීමයි.
"නම" නමින් පරමාණුක නූල් ගුණාංගයක් ඇතැයි සිතමු, ඔබ [self setName:@"A"]
නූල් A වෙතින් අමතන්නේ නම්, [self setName:@"B"]
B නූල් වලින් අමතන්න , සහ [self name]
C නූල් වලින් අමතන්න , එවිට විවිධ නූල්වල සියලුම මෙහෙයුම් අනුක්රමිකව සිදු කරනු ඇත, එයින් අදහස් වන්නේ එක් නූල් කට්ටලයක් ක්රියාත්මක කරන්නේ නම් හෝ ලබා ගන්න, එවිට වෙනත් කෙඳි බලා සිටිනු ඇත.
මෙය දේපල "නම" කියවීම / ලිවීම ආරක්ෂිත කරයි, නමුත් තවත් ත්රෙඩ් එකක් [name release]
එකවර ඇමතුමක් ලබා දෙන්නේ නම් මෙම මෙහෙයුම බිඳවැටීමක් ඇති කළ හැකිය. එහි අර්ථය වන්නේ වස්තුවක් කියවීම / ලිවීම ආරක්ෂිතයි (ATOMIC), නමුත් වෙනත් නූල් වලට එකවරම ඕනෑම ආකාරයක පණිවිඩයක් වස්තුවට යැවිය හැකි බැවින් නූල්-ආරක්ෂිත නොවේ. සංවර්ධකයා එවැනි වස්තූන් සඳහා නූල් ආරක්ෂාව සහතික කළ යුතුය.
දේපල "නම" පරමාදර්ශී නොවේ නම්, ඉහත උදාහරණයේ ඇති සියලුම නූල් - ඒ, බී, සී සහ ඩී එකවරම අනපේක්ෂිත ප්රති .ලයක් ලබා දෙයි. පරමාණුක සම්බන්ධයෙන් ගත් කල, A, B හෝ C වලින් එකක් පළමුව ක්රියාත්මක වේ, නමුත් D ට සමාන්තරව ක්රියාත්මක කළ හැකිය.
මෙම ප්රශ්නයට වෙනත් විශිෂ්ට පිළිතුරු මගින් වාක්ය ඛණ්ඩය සහ අර්ථ නිරූපණය දැනටමත් මනාව අර්ථ දක්වා ඇත. නිසා ක්රියාත්මක සහ කාර්ය සාධනය මෙන්ම විස්තර නැත, මම මගේ පිළිතුර එකතු වනු ඇත.
මෙම 3 අතර ක්රියාකාරී වෙනස කුමක්ද?
මම සෑම විටම පරමාණුව පෙරනිමියක් ලෙස සලකන්නේ තරමක් කුතුහලයෙන්. වියුක්ත කිරීමේ මට්ටමේ දී, 100% නූල්-ආරක්ෂාව සාක්ෂාත් කර ගැනීම සඳහා වාහනයක් ලෙස පන්තියක් සඳහා පරමාණුක ගුණාංග භාවිතා කිරීම මූලික අවස්ථාවකි. සැබවින්ම නිවැරදි බහුකාර්ය වැඩසටහන් සඳහා, ක්රමලේඛකයාගේ මැදිහත්වීම අනිවාර්යයෙන්ම අවශ්යතාවයකි. මේ අතර, කාර්ය සාධන ලක්ෂණ සහ ක්රියාත්මක කිරීම තවමත් ගැඹුරින් විස්තර කර නොමැත. වසර ගණනාවක් තිස්සේ අධික ලෙස බහු-පාඩම් කරන ලද වැඩසටහන් කිහිපයක් ලියා ඇති මම nonatomic
පරමාණුක කිසිදු අරමුණක් සඳහා සංවේදී නොවන නිසා මගේ දේපල මුළු කාලයම ප්රකාශ කළෙමි . මෙම ප්රශ්නයේ පරමාණුක හා පරමාණුක නොවන ගුණාංග පිළිබඳ සාකච්ඡා කිරීමේදී , මම පැතිකඩ කිහිපයක් කුතුහලයෙන් පිරි ප්රති .ල ලබා ගත්තා.
ක්රියාත්මක කිරීම
හරි. මම ඉවත් කිරීමට කැමති පළමු දෙය නම් අගුලු දැමීම ක්රියාත්මක කිරීම ක්රියාත්මක කිරීම-අර්ථ දැක්වීම සහ වියුක්ත කිරීමයි. ලුවී @synchronized(self)
සිය උදාහරණයේ භාවිතා කරයි - මෙය ව්යාකූලත්වයේ පොදු ප්රභවයක් ලෙස මම දැක ඇත්තෙමි. ක්රියාත්මක කිරීම ඇත්ත වශයෙන්ම භාවිතා නොවේ @synchronized(self)
; එය වස්තු මට්ටමේ භ්රමණ අගුල් භාවිතා කරයි . අප සැවොම හුරුපුරුදු ඉදිකිරීම් භාවිතා කරමින් ඉහළ මට්ටමේ නිදර්ශනයක් සඳහා ලුවීගේ නිදර්ශනය හොඳයි, නමුත් එය භාවිතා නොකරන බව දැන ගැනීම වැදගත්ය @synchronized(self)
.
තවත් වෙනසක් වන්නේ පරමාණුක ගුණාංග මඟින් ඔබේ වස්තූන් ලබා ගන්නා තැනැත්තා තුළ රඳවා තබා ගැනීමයි.
කාර්ය සාධනය
පරමාණුක දේපල භාවිතා කාර්ය සාධන දී ප්රවේශ: මෙන්න රසවත් කොටසක් නිතරගයෙන් (උදා: තනි-පිලිතුරු පොටවල්) නඩු සමහර අවස්ථාවල දී ඇත්තටම ඉතා වේගවත් විය හැක. පරමාදර්ශී අවස්ථාවන්ට වඩා අඩු කාලයකදී, පරමාණුක ප්රවේශයන් භාවිතා කිරීම ඉහළින් 20 ගුණයකින් වැඩි විය හැකිය nonatomic
. කරන අතර තරග 7 නූල් භාවිතා නඩුව තුනක්-බයිට struct (2.2 GHz ට 44 වතාවක් හෙමින් විය Core i7, Quad Core, x86_64). බයිට් තුනේ ව්යුහය ඉතා මන්දගාමී දේපලකට උදාහරණයකි.
සිත්ගන්නාසුලු පැති සටහන: බයිට් තුනේ ව්යුහයේ පරිශීලක-නිර්වචනය කළ ප්රවේශයන් සංස්ලේෂණය කරන ලද පරමාණුක ප්රවේශයන්ට වඩා 52 ගුණයකින් වේගවත් විය; හෝ සංස්ලේෂණය කරන ලද පරමාණුක නොවන ප්රවේශයන්ගේ වේගය 84% කි.
තරඟකාරී අවස්ථාවන්හි වස්තූන් ද 50 ගුණයක් ඉක්මවිය හැකිය.
ප්රශස්තිකරණ ගණන සහ ක්රියාත්මක කිරීමේ වෙනස්කම් නිසා, මෙම සන්දර්භය තුළ සැබෑ ලෝක බලපෑම් මැනීම තරමක් අපහසුය. ඔබට බොහෝ විට "එය විශ්වාස කරන්න, ඔබ පැතිකඩක් සොයාගෙන එය ගැටලුවක් නොවේ නම්" වැනි දෙයක් ඔබට ඇසෙනු ඇත. වියුක්ත මට්ටම නිසා, සත්ය බලපෑම මැනීම සැබවින්ම දුෂ්කර ය. පැතිකඩවලින් සත්ය පිරිවැය ලබා ගැනීම බොහෝ කාලයක් ගත වන අතර වියුක්ත කිරීම් හේතුවෙන් තරමක් සාවද්ය වේ. ARC එදිරිව MRC ද විශාල වෙනසක් කළ හැකිය.
එබැවින් දේපල ප්රවේශයන් ක්රියාත්මක කිරීම කෙරෙහි අවධානය යොමු නොකර පසුපසට යමු, අපි සාමාන්ය සැකකරුවන් වැනි අය ඇතුළත් කර objc_msgSend
, සහ නොවිසඳුණු අවස්ථා වලදී (තත්පර NSString
ගණනක අගයන්) ලබා ගන්නෙකුට බොහෝ ඇමතුම් සඳහා සැබෑ ලෝකයේ ඉහළ මට්ටමේ ප්රති results ල පරීක්ෂා කරන්නෙමු :
ඔබ බොහෝ විට අනුමාන කළ පරිදි, විමර්ශන ගණන් කිරීමේ ක්රියාකාරකම් / පාපැදි යනු පරමාණුක හා ARC යටතේ සැලකිය යුතු දායකත්වයක් සපයයි. තරඟකාරී අවස්ථාවන්හි වැඩි වෙනස්කම් ද ඔබ දකිනු ඇත.
මම කාර්ය සාධනය කෙරෙහි දැඩි අවධානයක් යොමු කළද, මම තවමත් කියන්නේ සෙමන්ටික්ස් ෆස්ට්! . මේ අතර, බොහෝ ව්යාපෘති සඳහා කාර්ය සාධනය අඩු ප්රමුඛතාවයකි. කෙසේ වෙතත්, ඔබ භාවිතා කරන තාක්ෂණයන්හි ක්රියාත්මක කිරීමේ තොරතුරු සහ පිරිවැය දැන ගැනීම නිසැකවම හානියක් නොවේ. ඔබේ අවශ්යතා, අරමුණු සහ හැකියාවන් සඳහා නිවැරදි තාක්ෂණය භාවිතා කළ යුතුය. මෙය ඔබට පැය කිහිපයක් සැසඳීම් ඉතිරි කර දෙනු ඇතැයි අපේක්ෂා කරන අතර, ඔබේ වැඩසටහන් සැලසුම් කිරීමේදී වඩා හොඳ දැනුවත් තීරණයක් ගැනීමට ඔබට උපකාරී වනු ඇත.
NSString
අමරණීය නොවන තනි නූල් සහිත අස්ථිර නඩුවක් සඳහා 10.8 ඉලක්ක කර ගනිමින් 10.8 ට එකම යන්ත්රයකින් පරීක්ෂා කර බැලුවෙමි: - ප්රති results ල -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
ස්ථානය:නිදර්ශන විචල්යය බහු නූල් මගින් වෙනස් නොකරන්නේ නම් ඔබට එය භාවිතා කළ හැකිය. එය කාර්ය සාධනය වැඩි දියුණු කරයි.
මම පරමාණුක හා රාජ්ය නොවන පරමාණුක ගුණ පිළිබඳ ඉතා හොදින් තබා පැහැදිලි කිරීමක් සොයා මෙහි . මෙන්න අදාළ අදාළ පෙළ කිහිපයක්:
'පරමාණුක' යන්නෙන් අදහස් කරන්නේ එය බිඳ දැමිය නොහැකි බවයි. මෙහෙයුම් පද්ධතිය / ක්රමලේඛනය අනුව පරමාණුක ශ්රිත ඇමතුමකට බාධා කළ නොහැකි එකකි - සම්පූර්ණ ක්රියාකාරිත්වයම ක්රියාත්මක කළ යුතු අතර එය සම්පූර්ණ වන තෙක් මෙහෙයුම් පද්ධතියේ සුපුරුදු සන්දර්භය මාරුවීම මඟින් CPU වෙතින් මාරු නොවිය යුතුය. යන්තම් නඩුව ඔබ දන්නේ නැහැ: CPU එක පමණක් වරකට එක දෙයක් කරන්න හැකි බැවින්, මෙම මෙහෙයුම් පද්ධතිය කුඩා කාලය පෙති සියලුම ක්රියාවලීන් සඳහා CPU ප්රවේශ කැරකෙන, ලබා දීමට මායාවබහු කාර්යයන්. CPU උපලේඛකයාට ක්රියාවලියක් ක්රියාත්මක කිරීමේදී ඕනෑම වේලාවක බාධා කළ හැකිය (සහ කරයි) - මධ්ය ක්රියාකාරී ඇමතුමකදී පවා. එම නිසා ක්රියාවලි දෙකක් එකවර විචල්යය යාවත්කාලීන කිරීමට උත්සාහ කළ හැකි හවුල් කවුන්ටර විචල්යයන් යාවත්කාලීන කිරීම වැනි ක්රියා සඳහා ඒවා 'පරමාණුකව' ක්රියාත්මක කළ යුතුය, එනම්, වෙනත් ඕනෑම ක්රියාවලියක් වෙනත් ස්ථානයකට මාරු කිරීමට පෙර සෑම යාවත්කාලීන ක්රියාවක්ම සම්පූර්ණයෙන්ම අවසන් කළ යුතුය. CPU.
එබැවින් මම අනුමාන කරන්නේ මෙම අවස්ථාවේ දී පරමාණුක අර්ථය වන්නේ ගුණාංග කියවීමේ ක්රමයට බාධා කළ නොහැකි බවයි - එහි ප්රති means ලය වන්නේ ක්රමවේදය මඟින් කියවනු ලබන විචල්ය (ය) වලට ඒවායේ වටිනාකම අඩකින් වෙනස් කළ නොහැකි නිසා වෙනත් නූල් / ඇමතුම් / ශ්රිතයක් ලැබෙන බැවිනි CPU වෙත මාරු විය.
මෙම නිසා atomic
විචල්ය, මදකට නතර වූ වෙන්න බැහැ, වටිනාකම කිසිදු අවස්ථාවක ඔවුන් විසින් අඩංගු (නූල්-lock) විය සහතික කර ඇත වෙසෙසින්ම , මෙම නූල් අගුලු මන්දගාමී ඔවුන් වෙත ප්රවේශ කරයි සහතික වුවද. non-atomic
විචල්යයන්, අනෙක් අතට, එවැනි සහතිකයක් ලබා නොදෙන නමුත් ඉක්මන් ප්රවේශයේ සුඛෝපභෝගීත්වය ලබා දෙයි. එය සාරාංශගත කිරීම සඳහා, non-atomic
ඔබේ විචල්යයන් එකවර බහු නූල් මඟින් ප්රවේශ නොවන බව ඔබ දැනගත් විට ගොස් දේවල් වේගවත් කරන්න.
බොහෝ ලිපි කියවීමෙන් පසු, පිටාර ගැලීම් පෝස්ට් සහ විචල්ය දේපල ගුණාංග පරීක්ෂා කිරීම සඳහා නිරූපණ යෙදුම් කිරීමෙන් පසුව, සියලු ගුණාංග තොරතුරු එකට තැබීමට මම තීරණය කළෙමි:
atomic
// පෙරනිමිnonatomic
strong = retain
// පෙරනිමිweak = unsafe_unretained
retain
assign
// පෙරනිමිunsafe_unretained
copy
readonly
readwrite
// පෙරනිමිIOS හි විචල්ය දේපල ගුණාංග හෝ වෙනස් කරන්නන් යන ලිපියෙන් ඔබට ඉහත සඳහන් සියලු ගුණාංග සොයාගත හැකි අතර එය අනිවාර්යයෙන්ම ඔබට උපකාරී වනු ඇත.
atomic
atomic
විචල්යයට (ස්ථිතික වර්ගය) ප්රවේශ වන්නේ එක් නූල් එකක් පමණි.atomic
නූල් ආරක්ෂිතයි.atomic
පෙරනිමි හැසිරීමයිඋදාහරණයක්:
@property (retain) NSString *name;
@synthesize name;
nonatomic
nonatomic
බහු නූල් විචල්යයට ප්රවේශ වීම (ගතික වර්ගය).nonatomic
නූල්-අනාරක්ෂිතයි.nonatomic
පෙරනිමි හැසිරීම නොවේ. nonatomic
දේපල ගුණාංගයේ අපට මූලික පදය එක් කළ යුතුය .උදාහරණයක්:
@property (nonatomic, retain) NSString *name;
@synthesize name;
දේපල සඳහා ප්රවේශය පරමාණුක ආකාරයෙන් සිදු කරන බවට පරමාණුක සහතිකය. උදා: එය සෑම විටම සම්පුර්ණයෙන්ම ආරම්භ කරන ලද වස්තුවක් ආපසු ලබා දෙයි, එක් ත්රෙඩ් එකක ඇති ඕනෑම දේපලක් / කට්ටලයක් තවත් කෙනෙකුට ප්රවේශ වීමට පෙර එය සම්පූර්ණ කළ යුතුය.
පහත දැක්වෙන ශ්රිතය නූල් දෙකක එකවර සිදුවන බව ඔබ සිතන්නේ නම්, ප්රති results ල ලස්සන නොවන්නේ මන්දැයි ඔබට දැක ගත හැකිය.
-(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;
}
...
}
වාසි: සෑම අවස්ථාවකදීම සම්පුර්ණයෙන්ම ආරම්භ කරන ලද වස්තූන් නැවත පැමිණීම බහු-නූල් කිරීමේදී හොඳම තේරීම වේ.
අවාසි: කාර්ය සාධනය පහර දීම, ක්රියාත්මක කිරීම ටිකක් මන්දගාමී කරයි
පරමාණුක මෙන් නොව, සෑම අවස්ථාවකදීම සම්පුර්ණයෙන්ම ආරම්භක වස්තුව නැවත පැමිණීම සහතික නොකරයි.
වාසි: ඉතා වේගයෙන් ක්රියාත්මක කිරීම.
අවාසි: බහු නූල් දැමීමේදී කසළ වටිනාකම ඇතිවීමේ අවස්ථා.
පළමුව පහසුම පිළිතුර: ඔබේ දෙවන උදාහරණ දෙක අතර වෙනසක් නැත. පෙරනිමියෙන්, දේපල ප්රවේශ කරන්නන් පරමාණුක වේ.
කසළ එකතු නොකරන ලද පරිසරයක පරමාණුක ප්රවේශයන් (එනම් රඳවා තබා ගැනීම / මුදා හැරීම / ස්වයංක්රීයව මුදා හැරීම භාවිතා කරන විට) අගුලක් භාවිතා කර වෙනත් නූලක් නිවැරදි සැකසුම / අගය ලබා ගැනීමට බාධා නොකරන බව සහතික කරයි.
තවත් තොරතුරු සඳහා සහ බහු-නූල් යෙදුම් නිර්මාණය කිරීමේදී වෙනත් කරුණු සඳහා ඇපල් හි පරමාර්ථ-සී 2.0 ප්රලේඛනයේ “ කාර්ය සාධනය සහ නූල් දැමීම ” කොටස බලන්න .
පරමාණුක යනු විචල්යයට (ස්ථිතික වර්ගය) ප්රවේශ වන්නේ එක් නූල් එකක් පමණි. පරමාණුක නූල් ආරක්ෂිත නමුත් එය මන්දගාමී වේ.
Nonatomic යන්නෙන් බහු නූල් විචල්යයට (ගතික වර්ගය) ප්රවේශ වේ. Nonatomic යනු නූල්-අනාරක්ෂිත නමුත් එය වේගවත් ය.
පරමාණුක වේ නූල් ආරක්ෂිත , එය මන්දගාමී හා එය හොඳින් තහවුරු (සහතික නැත) පමණක් අගුලු දමා අගය එම කලාපයේ වඩා ප්රවේශ උත්සාහ කොපමණ නූල් උනත් සපයනු ලබන බව. පරමාණුක භාවිතා කරන විට, මෙම ශ්රිතය තුළ ලියා ඇති කේත කැබැල්ලක් විවේචනාත්මක කොටසේ කොටසක් බවට පත්වන අතර වරකට එක් නූල් එකක් පමණක් ක්රියාත්මක කළ හැකිය.
එය නූල් ආරක්ෂාව පමණක් සහතික කරයි; එය සහතික නොකරයි. මා අදහස් කළේ ඔබ ඔබේ මෝටර් රථය සඳහා විශේෂ driver රියදුරෙකු කුලියට ගැනීමයි, නමුත් එය මෝටර් රථයට අනතුරක් සිදු නොවන බවට සහතික නොවේ. කෙසේ වෙතත්, සම්භාවිතාව අවම වශයෙන් පවතී.
පරමාණුක - එය බිඳ දැමිය නොහැක, එබැවින් ප්රති result ලය බලාපොරොත්තු වේ. Nonatomic සමඟ - වෙනත් නූලක් මතක කලාපයට පිවිසෙන විට එය වෙනස් කළ හැකිය, එබැවින් ප්රති result ලය අනපේක්ෂිත වේ.
කේත කතාව:
දේපල නූල් පරමාණුක සාදන්නා සහ සැකසීම ආරක්ෂිතයි. උදාහරණයක් ලෙස ඔබ ලියා ඇත්නම්:
self.myProperty = value;
නූල් ආරක්ෂිතයි.
[myArray addObject:@"Abc"]
නූල් ආරක්ෂිත නොවේ.
එවැනි පරමාණුක "පරමාණුක" නැත
@property(atomic, retain) UITextField *userName;
ඉහත සඳහන් ආකාරයට අපට භාවිතා කළ හැකිය
@property(retain) UITextField *userName;
ශුද්ධාසනයේ Stack පමාණය ප්රශ්නය මම @property භාවිතා කරන්නේ නම් මම ප්රශ්න ලැබෙන්නේ (පරමාණුක, රඳවා) NSString * myString .
පරමාණුක (පෙරනිමි)
පරමාණුක යනු පෙරනිමියයි: ඔබ කිසිවක් ටයිප් නොකරන්නේ නම්, ඔබේ දේපල පරමාණුක වේ. පරමාණුක දේපලක් ඔබ එයින් කියවීමට උත්සාහ කළහොත් ඔබට වලංගු වටිනාකමක් ලැබෙනු ඇති බවට සහතික වේ. එම අගය කුමක් විය හැකිද යන්න පිළිබඳව එය කිසිදු සහතිකයක් ලබා නොදේ, නමුත් ඔබට හොඳ දත්ත නැවත ලැබෙනු ඇත. මෙය ඔබට කිරීමට ඉඩ දෙන්නේ ඔබට එක් විචල්යයකට යොමු වන බහු නූල් හෝ බහු ක්රියාදාමයන් තිබේ නම්, එක් නූල් කියවිය හැකි අතර තවත් නූල් ලිවිය හැකිය. ඒවා එකවර පහර දුන්නොත්, පා values කයාගේ නූල් අගයන් දෙකෙන් එකක් ලබා ගැනීමට සහතික වේ: වෙනස් වීමට පෙර හෝ වෙනස් වීමෙන් පසුව. පරමාණුක ඔබට ලබා නොදෙන දෙය නම් ඔබට ලැබිය හැකි එම අගයන්ගෙන් කවර හෝ සහතිකයක්. පරමාණුක ඇත්තෙන්ම නූල්-ආරක්ෂිත වීම සමඟ ව්යාකූල වී ඇති අතර එය නිවැරදි නොවේ. ඔබේ නූල් ආරක්ෂාව වෙනත් ආකාරවලින් සහතික කළ යුතුය.
nonatomic
අනෙක් පැත්තෙන් පරමාණුක නොවන, ඔබට අනුමාන කළ හැකි පරිදි, “එම පරමාණුක දේ නොකරන්න” යන්නයි. ඔබට අහිමි වන දෙය නම් ඔබ සැමවිටම යමක් ආපසු ලබා ගන්නා බවට සහතික වීමයි. ඔබ ලිවීමක් මධ්යයේ කියවීමට උත්සාහ කරන්නේ නම්, ඔබට කසළ දත්ත ආපසු ලබා ගත හැකිය. නමුත්, අනෙක් අතට, ඔබ ටිකක් වේගයෙන් යන්න. පරමාණුක ගුණාංග මඟින් ඔබට වටිනාකමක් නැවත ලැබෙනු ඇති බවට සහතික වීම සඳහා යම් ඉන්ද්රජාලයක් කළ යුතු බැවින් ඒවා ටිකක් මන්දගාමී වේ. එය ඔබ බොහෝ දේ වෙත පිවිසෙන දේපලක් නම්, ඔබට එම වේගවත් ද .ුවම් නොලැබෙන බවට වග බලා ගැනීම සඳහා ඔබට nonatomic වෙත බැසීමට අවශ්ය විය හැකිය.
වැඩි විස්තර මෙතැනින් බලන්න: https://realm.io/news/tmi-objective-c-property-attributes/
මෙම පෙරනිමි වේ atomic
, මෙම මාර්ගයෙන් ඔබ දේපල භාවිතා විට එය ඔබට කාර්ය සාධනය වැය වේ, නමුත් එය නූල් ආරක්ෂිත වේ. Objective-C කරන්නේ කුමක්ද, අගුලක් සකසා ඇත, එබැවින් නියමයට / ලබා ගන්නා තැනැත්තා ක්රියාත්මක වන තාක් දුරට සත්ය නූල් පමණක් විචල්යයට ප්රවේශ විය හැකිය.
අයිවර් _ අභ්යන්තරයක් සහිත දේපලක එම්ආර්සී සමඟ උදාහරණය:
[_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
සැමවිටම සහතික වනු ඇත
පරමාර්ථ-සී හි මතකය කළමනාකරණය කරන ආකාරය රඳවා ගැනීමේ ගණන් වේ. ඔබ වස්තුවක් නිර්මාණය කරන විට, එහි රඳවා ගැනීමේ ගණන 1 ක් ඇත. ඔබ වස්තුවක් රඳවා ගැනීමේ පණිවිඩයක් යවන විට, එහි රඳවා ගැනීමේ ගණන 1 කින් වැඩි වේ. ඔබ වස්තුවක් මුදා හැරීමේ පණිවිඩයක් යවන විට, එහි රඳවා ගැනීමේ ගණන 1 කින් අඩු වේ. වස්තුවකට ස්වයංක්රීය මුදාහැරීමේ පණිවිඩයක් යවන්න , අනාගතයේ යම් අවස්ථාවක දී එහි රඳවා ගැනීමේ ගණන 1 කින් අඩු වේ. වස්තුවක රඳවා ගැනීමේ ගණන 0 දක්වා අඩු කළ හොත් එය අවලංගු වේ.
කුමන?! බහු තෙරපීම සහ නූල් ආරක්ෂාව වෙනස්ද?
ඔව්. බහුවිධ කියවීම යන්නෙන් අදහස් වන්නේ: බහු නූල් වලට එකවර බෙදාගත් දත්ත කැබැල්ලක් කියවිය හැකි අතර අපි බිඳ වැටෙන්නේ නැත, නමුත් ඔබ ස්වයංක්රීය නොවන අගයකින් කියවන්නේ නැති බවට එය සහතික නොවේ. නූල් ආරක්ෂාව සමඟ, ඔබ කියවන දේ ස්වයංක්රීයව නිකුත් නොවන බවට සහතික වේ. පෙරනිමියෙන් අපි සෑම දෙයක්ම පරමාණුක බවට පත් නොකිරීමට හේතුව, කාර්ය සාධන පිරිවැයක් තිබීම සහ බොහෝ දේ සඳහා නූල් ආරක්ෂාව අවශ්ය නොවේ. අපගේ කේතයේ කොටස් කිහිපයකට එය අවශ්ය වන අතර එම කොටස් කිහිපය සඳහා අගුල්, මුටෙක්ස් හෝ සමමුහුර්තකරණය භාවිතා කරමින් අපගේ කේතය නූල් ආරක්ෂිත ආකාරයකින් ලිවිය යුතුය.
nonatomic
සමස්තයක් වශයෙන් ඒවා අංශ 2 කින් වෙනස් වේ:
ස්වයංක්රීය මුදාහැරීමේ තටාකයක් තිබීම හෝ නොතිබීම නිසා බිඳ වැටීම හෝ නොවේ.
'තවම අවසන් කර නැති හෝ හිස් අගයක්' මධ්යයේ නිවැරදිව කියවීමට ඉඩ දීම හෝ ඉඩ දීම සම්පූර්ණයෙන් ලියා ඇති විට පමණක් කියවීමට ඉඩ දීම .
ඔබ ඔබේ දේපල බහු-නූල් කේතයකින් භාවිතා කරන්නේ නම් එවිට ඔබට පරමාණුක හා පරමාණුක ගුණාංග අතර වෙනස දැකගත හැකිය. පරමාණුක පරමාණුකයට වඩා වේගවත් වන අතර පරමාණුක නූල්-ආරක්ෂිත වේ.
විජේන්ද්ර ත්රිපාති දැනටමත් බහු නූල් පරිසරයක් සඳහා උදාහරණයක් ලබා දී ඇත.
ප්රකාශ කරන්නේ කෙසේද:
පරමාණුක පෙරනිමිය බැවින්,
@property (retain) NSString *name;
සහ ක්රියාත්මක කිරීමේ ගොනුවේ
self.name = @"sourov";
දේපල තුනකට අදාළ කාර්යයක් යැයි සිතමු
@property (retain) NSString *name;
@property (retain) NSString *A;
@property (retain) NSString *B;
self.name = @"sourov";
සියලුම ගුණාංග සමාන්තරව ක්රියා කරයි (අසමමුහුර්තව මෙන්).
ඔබ A නූලෙන් "නම" අමතන්නේ නම් ,
සහ
ඒ සමඟම ඔබ අමතන්නේ නම්
[self setName:@"Datta"]
නූල් බී සිට ,
දැන් * නම් දේපල පරමාණුක නොවේ නම්
පරමාණුක නොවන බව නූල් අනාරක්ෂිත ලෙස හඳුන්වන්නේ එබැවිනි, නමුත් සමාන්තරව ක්රියාත්මක වීම නිසා එය වේගයෙන් ක්රියාකාරී වේ
දැන් නම් නම් දේපල පරමාණුක වේ
පරමාණුක නූල් සේෆ් ලෙසත්, එය කියවීම-ලිවීම ආරක්ෂිත ලෙසත් හඳුන්වන්නේ එබැවිනි
එවැනි තත්ව මෙහෙයුම් අනුක්රමිකව සිදු කරනු ඇත. සහ කාර්ය සාධනය මන්දගාමී වේ
- Nonatomic යන්නෙන් බහු නූල් විචල්යයට ප්රවේශ වේ (ගතික වර්ගය).
- Nonatomic යනු නූල් අනාරක්ෂිත ය.
- නමුත් එය වේගවත් කාර්ය සාධනයකි
-නොනාටොමික් යනු පෙරනිමි හැසිරීමක් නොවේ, අපි දේපල ගුණාංගයේ පරමාණුක නොවන මූල පදයක් එකතු කළ යුතුය.
ස්විෆ්ට්හි දී ObjC අර්ථයෙන් ස්විෆ්ට් ගුණාංග පරමාණුක නොවන බව සනාථ කිරීම සඳහා. එක් හේතුවක් නම්, ඔබේ අවශ්යතාවයන් සඳහා එක් දේපල පරමාණුවක් ප්රමාණවත් ද යන්න ගැන ඔබ සිතීමයි.
යොමුව: https://forums.developer.apple.com/thread/25642
වැඩි විස්තර සඳහා කරුණාකර http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html වෙබ් අඩවියට පිවිසෙන්න.
atomic
ය නැති නූල්-ආරක්ෂිත! එය නූල් ගැටළු වලට වඩා ප්රතිරෝධී වන නමුත් නූල් ආරක්ෂිත නොවේ. එය ඔබට සම්පූර්ණ වටිනාකමක් ලබා දෙන බව සහතික කරයි, එනම් “නිවැරදි” අගයක් (ද්විමය මට්ටම), නමුත් එය කිසිසේත් එය ඔබේ ව්යාපාර තර්කනය සඳහා වර්තමාන සහ “නිවැරදි” අගය බව සහතික නොකරනු ඇත (එය අතීත වටිනාකමක් විය හැකිය ඔබගේ තර්කනයෙන් වලංගු නොවේ).
පරමාණුක පරමාණුක (පෙරනිමි)
පරමාණුක යනු පෙරනිමියයි: ඔබ කිසිවක් ටයිප් නොකරන්නේ නම්, ඔබේ දේපල පරමාණුක වේ. පරමාණුක දේපලක් ඔබ එයින් කියවීමට උත්සාහ කළහොත් ඔබට වලංගු වටිනාකමක් ලැබෙනු ඇති බවට සහතික වේ. එම අගය කුමක් විය හැකිද යන්න පිළිබඳව එය කිසිදු සහතිකයක් ලබා නොදේ, නමුත් ඔබට හොඳ දත්ත නැවත ලැබෙනු ඇත. මෙය ඔබට කිරීමට ඉඩ දෙන්නේ ඔබට එක් විචල්යයකට යොමු වන බහු නූල් හෝ බහු ක්රියාදාමයන් තිබේ නම්, එක් නූල් කියවිය හැකි අතර තවත් නූල් ලිවිය හැකිය. ඒවා එකවර පහර දුන්නොත්, පා values කයාගේ නූල් අගයන් දෙකෙන් එකක් ලබා ගැනීමට සහතික වේ: වෙනස් වීමට පෙර හෝ වෙනස් වීමෙන් පසුව. පරමාණුක ඔබට ලබා නොදෙන දෙය නම් ඔබට ලැබිය හැකි එම අගයන්ගෙන් කවර හෝ සහතිකයක්. පරමාණුක ඇත්තෙන්ම නූල්-ආරක්ෂිත වීම සමඟ ව්යාකූල වී ඇති අතර එය නිවැරදි නොවේ. ඔබේ නූල් ආරක්ෂාව වෙනත් ආකාරවලින් සහතික කළ යුතුය.
nonatomic
අනෙක් පැත්තෙන් පරමාණුක නොවන, ඔබට අනුමාන කළ හැකි පරිදි, “එම පරමාණුක දේ නොකරන්න” යන්නයි. ඔබට අහිමි වන දෙය නම් ඔබ සැමවිටම යමක් ආපසු ලබා ගන්නා බවට සහතික වීමයි. ඔබ ලිවීමක් මධ්යයේ කියවීමට උත්සාහ කරන්නේ නම්, ඔබට කසළ දත්ත ආපසු ලබා ගත හැකිය. නමුත්, අනෙක් අතට, ඔබ ටිකක් වේගයෙන් යන්න. පරමාණුක ගුණාංග මඟින් ඔබට වටිනාකමක් නැවත ලැබෙනු ඇති බවට සහතික වීම සඳහා යම් ඉන්ද්රජාලයක් කළ යුතු බැවින් ඒවා ටිකක් මන්දගාමී වේ. එය ඔබ බොහෝ දේ වෙත පිවිසෙන දේපලක් නම්, ඔබට එම වේගවත් ද .ුවම් නොලැබෙන බවට වග බලා ගැනීම සඳහා ඔබට nonatomic වෙත බැසීමට අවශ්ය විය හැකිය. ප්රවේශ
අනුග්රහය 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);
}
සම්පූර්ණ ව්යාකූලත්වය සරල කිරීම සඳහා, අපි mutex අගුල තේරුම් ගනිමු.
මුටෙක්ස් අගුල, නමට අනුව, වස්තුවේ විකෘතිතාව අගුළු දමයි. එබැවින් වස්තුවකට පන්තියකට ප්රවේශ වුවහොත් වෙනත් කිසිදු පන්තියකට එකම වස්තුවකට ප්රවේශ විය නොහැක.
IOS හි, @sychronise
මූටෙක්ස් අගුලද සපයයි .දැන් එය FIFO මාදිලියේ සේවය කරන අතර එකම අවස්ථාව බෙදා ගන්නා පන්ති දෙකකින් ප්රවාහයට බලපෑමක් නොවන බව සහතික කරයි. කෙසේ වෙතත්, කාර්යය ප්රධාන ත්රෙඩ් එකක තිබේ නම්, පරමාණුක ගුණාංග භාවිතයෙන් වස්තුවට ප්රවේශ වීමෙන් වළකින්න, මන්ද එය ඔබේ UI රඳවා තබාගෙන ක්රියාකාරිත්වය පිරිහීමට ලක්විය හැකිය.
පරමාණුක ගුණාංග : - පරමාණුක දේපල සමඟ පවරා ඇති විචල්යයකට එයින් අදහස් වන්නේ එක් නූල් ප්රවේශයක් පමණක් වන අතර එය නූල් ආරක්ෂිත වන අතර කාර්ය සාධන දෘෂ්ටිකෝණයෙන් හොඳ වනු ඇත, පෙරනිමි හැසිරීමක් ඇත.
පරමාණුක නොවන ගුණාංග : - පරමාණුක දේපල සමඟ පවරා ඇති විචල්යයකට බහු නූල් ප්රවේශයක් ඇති අතර එය නූල් ආරක්ෂිත නොවන අතර කාර්ය සාධන දෘෂ්ටිකෝණය මන්දගාමී වනු ඇත, පෙරනිමි හැසිරීම් ඇති අතර විවිධ නූල් දෙකක් එකවර විචල්යයට ප්රවේශ වීමට අවශ්ය විට එය අනපේක්ෂිත ප්රති .ල ලබා දෙනු ඇත.