පරමාණුක හා පරමාණුක නොවන ගුණාංග අතර වෙනස කුමක්ද?


1852

කුමක් atomicහා nonatomicදේපල ප්රකාශ දී අදහස් කරන්නේ?

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

මෙම තිදෙනා අතර මෙහෙයුම් වෙනස කුමක්ද?


Answers:


1763

අන්තිම දෙක සමාන ය; "පරමාණුක" යනු පෙරනිමි හැසිරීමයි ( එය ඇත්ත වශයෙන්ම මූල පදයක් නොවන බව සලකන්න; එය නිශ්චිතව දක්වා ඇත්තේnonatomic - atomicllvm / 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:හැකිය. මේ අතර, නූල් fullNameA හි ඇමතුම් දෙක අතරට නූල් B ඇමතිය හැකි අතර පැරණි මුල් නම සමඟ නව මුල් නම ලැබෙනු ඇත.

මෙය විසඳීම සඳහා ඔබට ගනුදෙනු ආකෘතියක් අවශ්‍ය වේ. එනම් වෙනත් ආකාරයක සමමුහුර්තකරණය සහ / හෝ බැහැර කිරීම මඟින් fullNameයැපෙන ගුණාංග යාවත්කාලීන වන විට කෙනෙකුට ප්‍රවේශය බැහැර කළ හැකිය .


21
ඕනෑම නූල්-ආරක්ෂිත කේතයක් තමන්ගේම අගුලු දැමීම යනාදිය සිදු කරන බැවින්, ඔබට පරමාණුක දේපල ප්‍රවේශයන් භාවිතා කිරීමට අවශ්‍ය වන්නේ කවදාද? හොඳ උදාහරණයක් ගැන සිතීමට මට අපහසුතාවයක් ඇත.
ඩැනියෙල් ඩිකිසන්

8
@bbum අර්ථවත් කරයි. නූල්-ආරක්ෂාව වඩාත් ආදර්ශ මට්ටමේ සැලකිල්ලක් දක්වන තවත් පිළිතුරකට ඔබේ අදහස් දැක්වීමට මම කැමතියි. IBM නූල් ආරක්ෂණ අර්ථ දැක්වීමකින්: ibm.co/yTEbjY "පංතියක් නිවැරදිව ක්‍රියාවට නංවා ඇත්නම්, එය එහි පිරිවිතරයන්ට අනුකූල බව පැවසීමේ තවත් ක්‍රමයක් නම්, මෙහෙයුම් අනුපිළිවෙලක් නොමැත (පොදු ක්ෂේත්‍ර කියවීම හෝ ලිවීම සහ පොදු ක්‍රම වෙත ඇමතුම්) එම පංතියේ වස්තූන් මත වස්තුව අවලංගු තත්වයකට පත් කිරීමට, වස්තුව අවලංගු තත්වයකට පත්වීමට නිරීක්ෂණය කිරීමට හෝ පන්තියේ කිසියම් වෙනස්කමක්, පූර්ව කොන්දේසි හෝ පසු කොන්දේසි උල්ලං late නය කිරීමට හැකි විය යුතුය.
බෙන් ෆ්ලින්

6
@ ස්ටීවන්ක්‍රාමර්ට සමාන උදාහරණයක් මෙන්න: මට @property NSArray* astronomicalEvents;UI හි පෙන්වීමට අවශ්‍ය දත්ත ලැයිස්තුගත කර ඇත. යෙදුම මඟින් දර්ශකය හිස් අරාවකට යොමු කරන විට, යෙදුම වෙබයෙන් දත්ත ඇද ගනී. වෙබ් ඉල්ලීම සම්පුර්ණ වූ විට (වෙනත් ත්‍රෙඩ් එකකින්) යෙදුම නව අරාවක් ගොඩනඟා පරමාණුකව දේපල නව දර්ශක අගයකට සකසයි. එය නූල් ආරක්ෂිත වන අතර මට යමක් මග හැරී ඇත්නම් මිස මට කිසිදු අගුලු දැමීමේ කේතයක් ලිවීමට අවශ්‍ය නොවීය. මට ගොඩක් ප්‍රයෝජනවත් බව පෙනේ.
bugloaf

10
Ot හොට්ලික්ස් තවත් විනෝදජනක එකක්; සමහර ගෘහ නිර්මාණ ශිල්පය මත (කුමන එකක්දැයි මතක තබා ගත නොහැක), තර්කයක් ලෙස සම්මත කළ බිට් 64 අගයන් ලේඛනයකින් අඩක් සහ තොගයේ අඩක් සම්මත කළ හැකිය. atomicහරස් නූල් අර්ධ අගය කියවීම් වළක්වයි. (එය සොයා ගැනීම විනෝදජනක දෝෂයකි.)
bbum

8
@Congliu Thread A නැටුමකින් තොරව වස්තුවක් ආපසු ලබා දෙයි retain/autorelease. නූල් බී වස්තුව නිකුත් කරයි. නූල් ඒ උත්පාතය . atomicප්‍රතිලාභ අගය සඳහා A නූල් ශක්තිමත් යොමු කිරීමක් (+1 රඳවා ගැනීමේ ගණන්) ඇති බව සහතික කරයි.
bbum

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

මූලික වශයෙන්, පරමාණුක අනුවාදයට නූල්වල ආරක්ෂාව සහතික කිරීම සඳහා අගුලක් ගත යුතු අතර, වස්තුව මත ref ගණනය කිරීම (සහ එය සමතුලිත කිරීම සඳහා ස්වයංක්‍රීය මුදාහැරීමේ ගණන) වැඩි කරයි, එවිට වස්තුව ඇමතුම්කරුට පවතින බවට සහතික වේ. වෙනත් ත්‍රෙඩ් එකක් අගය සකසන්නේ නම් එය විභව ධාවන තත්වයකි, එමඟින් ref ගණන 0 දක්වා පහත වැටේ.

ගුණාංග පරිමාණ අගයන් හෝ වස්තූන් ද යන්න මත පදනම්ව මේවා ක්‍රියා කරන ආකාරය සහ රඳවා තබා ගැනීම, පිටපත් කිරීම, කියවීමට පමණක්, පරමාණුක නොවන යනාදිය මත පදනම්ව විවිධ ප්‍රභේද විශාල සංඛ්‍යාවක් ඇත. පොදුවේ ගත් කල, දේපල සංස්ෙල්ෂක සියල්ලම සියලු සංයෝජනයන් සඳහා "නිවැරදි දේ" කරන්නේ කෙසේදැයි දනී.


8
@Louis Gerbarg: මම ඔබ (පරිශීලක නාමය == userName_ බව) එම වස්තුව වෙත පැවරීමට උත්සාහ නම් (රඳවා, nonatomic) පන්දු පිරිනමන්නා ක්රියා නොකරනු ඇත ඔබේ අනුවාදය විශ්වාස
ප්ෙලොරින්

5
ඔබේ කේතය තරමක් නොමඟ යවන සුළු ය; නැත කිසිදු පරමාණුක getters / ස්ථානගත වන්නන් සමමුහුර්ත දේ මත ඇප. විවේචනාත්මකව, @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/…
tc.

yfyolnish මට විශ්වාස නෑ _val/ මොකක්ද කියලා val, නමුත් නැහැ, ඇත්තටම නැහැ. පරමාණුක copy/ retainදේපළක් ලබා ගන්නා තැනැත්තා වෙනත් ත්‍රෙඩ් එකකින් ඇමතුම කැඳවීම නිසා එය නැවත ගණනය කිරීම ශුන්‍ය වන වස්තුවක් ආපසු නොඑන බවට සහතික විය යුතුය, එයින් මූලික වශයෙන් අදහස් කරන්නේ එය ඇත්දළ කියවිය යුතු බවත්, එය රඳවා තබා ගන්නා බවත් සහතික කර ඇති බවත්ය. එය නැවත ලිවීම සහ මුදා හැරීම, පසුව රඳවා තබා ගැනීම සමතුලිත කිරීම සඳහා එය ස්වයංක්‍රීයව මුදා හැරීම. එහි අර්ථය වන්නේ ලබා ගන්නා තැනැත්තා සහ සැකසුම්කරු යන දෙදෙනාම අගුලක් භාවිතා කළ යුතු බවයි (මතක පිරිසැලසුම සවි කර ඇත්නම් එය CAS2 උපදෙස් සමඟ කළ හැකි ය; අහෝ -retainක්‍රමවේදය ඇමතුමකි ).
ටී.සී.

ctc එය සෑහෙන කාලයක් ගතවී ඇති නමුත් මා ලිවීමට අදහස් කළේ මෙය විය හැකිය: gist.github.com/fjolnir/5d96b3272c6255f6baae නමුත් ඔව්, පැරණි අගය setFoo ට පෙර පා read කයාට කියවිය හැකිය: නැවත පැමිණ, සහ පෙර මුදා හැරීමට පෙර පා er කයා එය ආපසු ලබා දෙයි. නමුත් සමහර විට සැකකරු -rease වෙනුවට -autorelease භාවිතා කළේ නම්, එය නිවැරදි කරනු ඇත.
Fjölnir

yfyolnish අවාසනාවකට මෙන්, නැත: එය ස්වයංක්‍රීයව සකසන්නාගේ නූල් මත මුදා හරින අතර එය ලබා ගන්නා තැනැත්තාගේ නූල් මත ස්වයංක්‍රීයව මුදා හැරිය යුතුය. ඔබ පුනරාවර්තනය භාවිතා කරන නිසා තොගයෙන් ඉවතට යාමට (සිහින්) අවස්ථාවක් ඇති බව පෙනේ.
ටී.සී.

170

පරමාණුක

  • පෙරනිමි හැසිරීමයි
  • වෙනත් ක්‍රියාවලියක් විචල්‍යයට ප්‍රවේශ වීමට පෙර වර්තමාන ක්‍රියාවලිය CPU විසින් සම්පූර්ණ කර ඇති බව සහතික කරනු ඇත
  • වේගවත් නොවේ, එය ක්‍රියාවලිය මුළුමනින්ම අවසන් කර ඇති බව සහතික කරයි

පරමාණුක නොවන

  • පෙරනිමි හැසිරීම නොවේ
  • වේගවත් (සංස්ලේෂණය කළ කේතය සඳහා, එනම් ropproperty සහ ysynthesize භාවිතා කර නිර්මාණය කරන ලද විචල්‍යයන් සඳහා)
  • නූල් ආරක්ෂිත නොවේ
  • විවිධ ක්‍රියාදාමයන් දෙකක් එකම විචල්‍යයකට එකවර ප්‍රවේශ වන විට අනපේක්ෂිත ලෙස හැසිරීමට හේතු විය හැක

137

වෙනස තේරුම් ගැනීමට ඇති හොඳම ක්‍රමය පහත උදාහරණය භාවිතා කිරීමයි.

"නම" නමින් පරමාණුක නූල් ගුණාංගයක් ඇතැයි සිතමු, ඔබ [self setName:@"A"]නූල් A වෙතින් අමතන්නේ නම්, [self setName:@"B"]B නූල් වලින් අමතන්න , සහ [self name]C නූල් වලින් අමතන්න , එවිට විවිධ නූල්වල සියලුම මෙහෙයුම් අනුක්‍රමිකව සිදු කරනු ඇත, එයින් අදහස් වන්නේ එක් නූල් කට්ටලයක් ක්‍රියාත්මක කරන්නේ නම් හෝ ලබා ගන්න, එවිට වෙනත් කෙඳි බලා සිටිනු ඇත.

මෙය දේපල "නම" කියවීම / ලිවීම ආරක්ෂිත කරයි, නමුත් තවත් ත්‍රෙඩ් එකක් [name release]එකවර ඇමතුමක් ලබා දෙන්නේ නම් මෙම මෙහෙයුම බිඳවැටීමක් ඇති කළ හැකිය. එහි අර්ථය වන්නේ වස්තුවක් කියවීම / ලිවීම ආරක්ෂිතයි (ATOMIC), නමුත් වෙනත් නූල් වලට එකවරම ඕනෑම ආකාරයක පණිවිඩයක් වස්තුවට යැවිය හැකි බැවින් නූල්-ආරක්ෂිත නොවේ. සංවර්ධකයා එවැනි වස්තූන් සඳහා නූල් ආරක්ෂාව සහතික කළ යුතුය.

දේපල "නම" පරමාදර්ශී නොවේ නම්, ඉහත උදාහරණයේ ඇති සියලුම නූල් - ඒ, බී, සී සහ ඩී එකවරම අනපේක්ෂිත ප්‍රති .ලයක් ලබා දෙයි. පරමාණුක සම්බන්ධයෙන් ගත් කල, A, B හෝ C වලින් එකක් පළමුව ක්‍රියාත්මක වේ, නමුත් D ට සමාන්තරව ක්‍රියාත්මක කළ හැකිය.


116

මෙම ප්‍රශ්නයට වෙනත් විශිෂ්ට පිළිතුරු මගින් වාක්‍ය ඛණ්ඩය සහ අර්ථ නිරූපණය දැනටමත් මනාව අර්ථ දක්වා ඇත. නිසා ක්රියාත්මක සහ කාර්ය සාධනය මෙන්ම විස්තර නැත, මම මගේ පිළිතුර එකතු වනු ඇත.

මෙම 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 ල පරීක්ෂා කරන්නෙමු :

  • MRC | nonatomic | අතින් ක්‍රියාත්මක කරන ලද අය: 2
  • MRC | nonatomic | සංස්ලේෂණය කළ තැනැත්තා: 7
  • MRC | පරමාණුක | සංස්ලේෂණය කළ තැනැත්තා: 47
  • ARC | nonatomic | සංස්ලේෂණය කරන ලද ලබා ගන්නා තැනැත්තා: 38 (සටහන: ARC විසින් එකතු කරන ලද ref ගණන් බයිසිකල් පැදීම)
  • ARC | පරමාණුක | සංස්ලේෂණය කළ තැනැත්තා: 47

ඔබ බොහෝ විට අනුමාන කළ පරිදි, විමර්ශන ගණන් කිරීමේ ක්‍රියාකාරකම් / පාපැදි යනු පරමාණුක හා ARC යටතේ සැලකිය යුතු දායකත්වයක් සපයයි. තරඟකාරී අවස්ථාවන්හි වැඩි වෙනස්කම් ද ඔබ දකිනු ඇත.

මම කාර්ය සාධනය කෙරෙහි දැඩි අවධානයක් යොමු කළද, මම තවමත් කියන්නේ සෙමන්ටික්ස් ෆස්ට්! . මේ අතර, බොහෝ ව්‍යාපෘති සඳහා කාර්ය සාධනය අඩු ප්‍රමුඛතාවයකි. කෙසේ වෙතත්, ඔබ භාවිතා කරන තාක්ෂණයන්හි ක්‍රියාත්මක කිරීමේ තොරතුරු සහ පිරිවැය දැන ගැනීම නිසැකවම හානියක් නොවේ. ඔබේ අවශ්‍යතා, අරමුණු සහ හැකියාවන් සඳහා නිවැරදි තාක්‍ෂණය භාවිතා කළ යුතුය. මෙය ඔබට පැය කිහිපයක් සැසඳීම් ඉතිරි කර දෙනු ඇතැයි අපේක්ෂා කරන අතර, ඔබේ වැඩසටහන් සැලසුම් කිරීමේදී වඩා හොඳ දැනුවත් තීරණයක් ගැනීමට ඔබට උපකාරී වනු ඇත.


MRC | පරමාණුක | සංස්ලේෂණය කළ තැනැත්තා: 47 ARC | පරමාණුක | සංස්ලේෂණය කළ තැනැත්තා: 47 ඔවුන් සමාන වන්නේ කුමක් ද? ARC ට වැඩි පිරිවැයක් තිබිය යුතු නොවේද?
SDEZero

2
එබැවින් පරමාණුක ගුණාංග නරක නම් y ඒවා පෙරනිමිය වේ. බොයිලර් ප්ලේට් කේතය වැඩි කිරීමට?
කුනාල් බාලානි

• LearnCocos2D මම 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.
ජස්ටින්

ඔබට මෙම පරීක්ෂණය අන්තර්ජාලයේ කොතැනක හෝ තිබේද? මම දිගටම මගේ දේ මෙහි එක් කරමි: github.com/LearnCocos2D/LearnCocos2D/tree/master/…
LearnCocos2D

@ LearnCocos2D මම ඒවා මිනිස් පරිභෝජනය සඳහා සූදානම් කර නැත, සමාවෙන්න.
ජස්ටින්

95

පරමාණුක = නූල් ආරක්ෂාව

පරමාණුක නොවන = නූල් ආරක්ෂාව නැත

නූල් ආරක්ෂාව:

ධාවන කාල පරිසරය අනුව එම නූල් ක්‍රියාත්මක කිරීම උපලේඛනගත කිරීම හෝ අන්තර් සම්බන්ධ කිරීම නොසලකා, සහ ඇමතුම් කේතයේ අමතර සමමුහුර්තකරණය හෝ වෙනත් සම්බන්ධීකරණයක් නොමැතිව, බහු නූල් වලින් ප්‍රවේශ වන විට නිවැරදිව හැසිරෙන්නේ නම්, නිදර්ශන විචල්‍යයන් නූල් ආරක්ෂිත වේ.

අපගේ සන්දර්භය තුළ:

නූල් එකක අගය වෙනස් කළහොත් වෙනස් කළ අගය සියලු නූල් සඳහා ලබා ගත හැකි අතර වරකට අගය වෙනස් කළ හැක්කේ එක් නූල් එකකට පමණි.

භාවිතා කළ යුතු atomicස්ථානය:

නිදර්ශන විචල්‍යය බහු තෙරපුම් පරිසරයකට ප්‍රවේශ වන්නේ නම්.

ඇඟවුම් atomic:

ධාවන වේලාවේ සිට ඒ පිළිබඳ මුරටැඹ වැඩක් අවශ්‍ය නොවන nonatomicනිසා තරම් වේගවත් නොවේ nonatomic.

භාවිතා කළ යුතු nonatomicස්ථානය:

නිදර්ශන විචල්‍යය බහු නූල් මගින් වෙනස් නොකරන්නේ නම් ඔබට එය භාවිතා කළ හැකිය. එය කාර්ය සාධනය වැඩි දියුණු කරයි.


3
ඔබ මෙහි පවසන සෑම දෙයක්ම නිවැරදි ය, නමුත් අවසාන වාක්‍යය අත්‍යවශ්‍යයෙන්ම "වැරදි" ය, ඩුරා, අද වැඩසටහන් සඳහා. මේ ආකාරයෙන් "කාර්ය සාධනය වැඩි දියුණු කිරීමට" ඔබ උත්සාහ කිරීම ඇත්තෙන්ම සිතාගත නොහැකිය. . කේතයේ කිසිදු අදහස් දැක්වීමක් නොකරන්න, එය අපව මන්දගාමී කරයි. ” විශ්වාසනීයත්වය වෙනුවෙන් (නොපවතින) න්‍යායාත්මක කාර්ය සාධනය ලබා ගැනීමට ඔබට අවශ්‍ය යථාර්ථවාදී සංවර්ධන නල මාර්ගයක් නොමැත.
ෆැටි

3
@JoeBlow ඔබ මෙහි එය තහවුරු කළ හැකි එහි ඇත්ත developer.apple.com/library/mac/documentation/Cocoa/Conceptual/...
Durai Amuthan.H

1
ඩුරායි, එෆ්ඩබ්ලිව්අයිඩබ්ලිව්, එම සබැඳිය ඔබේ “පරමාණුක = නූල් ආරක්ෂාව” යන නිබන්ධයට කෙලින්ම පටහැනි වේ. ලේඛනයේ ඇපල් පැහැදිලිවම පවසන්නේ, “දේපල පරමාණුකතාව යනු වස්තුවක නූල් ආරක්ෂාවට සමාන නොවේ.” ප්‍රායෝගිකව, නූල් ආරක්ෂාව ලබා ගැනීම සඳහා පරමාණුක කලාතුරකින් ප්‍රමාණවත් වේ.
රොබ්

69

මම පරමාණුක හා රාජ්ය නොවන පරමාණුක ගුණ පිළිබඳ ඉතා හොදින් තබා පැහැදිලි කිරීමක් සොයා මෙහි . මෙන්න අදාළ අදාළ පෙළ කිහිපයක්:

'පරමාණුක' යන්නෙන් අදහස් කරන්නේ එය බිඳ දැමිය නොහැකි බවයි. මෙහෙයුම් පද්ධතිය / ක්‍රමලේඛනය අනුව පරමාණුක ශ්‍රිත ඇමතුමකට බාධා කළ නොහැකි එකකි - සම්පූර්ණ ක්‍රියාකාරිත්වයම ක්‍රියාත්මක කළ යුතු අතර එය සම්පූර්ණ වන තෙක් මෙහෙයුම් පද්ධතියේ සුපුරුදු සන්දර්භය මාරුවීම මඟින් CPU වෙතින් මාරු නොවිය යුතුය. යන්තම් නඩුව ඔබ දන්නේ නැහැ: CPU එක පමණක් වරකට එක දෙයක් කරන්න හැකි බැවින්, මෙම මෙහෙයුම් පද්ධතිය කුඩා කාලය පෙති සියලුම ක්රියාවලීන් සඳහා CPU ප්රවේශ කැරකෙන, ලබා දීමට මායාවබහු කාර්යයන්. CPU උපලේඛකයාට ක්‍රියාවලියක් ක්‍රියාත්මක කිරීමේදී ඕනෑම වේලාවක බාධා කළ හැකිය (සහ කරයි) - මධ්‍ය ක්‍රියාකාරී ඇමතුමකදී පවා. එම නිසා ක්‍රියාවලි දෙකක් එකවර විචල්‍යය යාවත්කාලීන කිරීමට උත්සාහ කළ හැකි හවුල් කවුන්ටර විචල්‍යයන් යාවත්කාලීන කිරීම වැනි ක්‍රියා සඳහා ඒවා 'පරමාණුකව' ක්‍රියාත්මක කළ යුතුය, එනම්, වෙනත් ඕනෑම ක්‍රියාවලියක් වෙනත් ස්ථානයකට මාරු කිරීමට පෙර සෑම යාවත්කාලීන ක්‍රියාවක්ම සම්පූර්ණයෙන්ම අවසන් කළ යුතුය. CPU.

එබැවින් මම අනුමාන කරන්නේ මෙම අවස්ථාවේ දී පරමාණුක අර්ථය වන්නේ ගුණාංග කියවීමේ ක්‍රමයට බාධා කළ නොහැකි බවයි - එහි ප්‍රති means ලය වන්නේ ක්‍රමවේදය මඟින් කියවනු ලබන විචල්‍ය (ය) වලට ඒවායේ වටිනාකම අඩකින් වෙනස් කළ නොහැකි නිසා වෙනත් නූල් / ඇමතුම් / ශ්‍රිතයක් ලැබෙන බැවිනි CPU වෙත මාරු විය.

මෙම නිසා atomicවිචල්ය, මදකට නතර වූ වෙන්න බැහැ, වටිනාකම කිසිදු අවස්ථාවක ඔවුන් විසින් අඩංගු (නූල්-lock) විය සහතික කර ඇත වෙසෙසින්ම , මෙම නූල් අගුලු මන්දගාමී ඔවුන් වෙත ප්රවේශ කරයි සහතික වුවද. non-atomicවිචල්යයන්, අනෙක් අතට, එවැනි සහතිකයක් ලබා නොදෙන නමුත් ඉක්මන් ප්රවේශයේ සුඛෝපභෝගීත්වය ලබා දෙයි. එය සාරාංශගත කිරීම සඳහා, non-atomicඔබේ විචල්‍යයන් එකවර බහු නූල් මඟින් ප්‍රවේශ නොවන බව ඔබ දැනගත් විට ගොස් දේවල් වේගවත් කරන්න.


1
සබැඳිය කැඩී ඇත. ; (
රොබ්


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 // පෙරනිමි

IOS හි විචල්‍ය දේපල ගුණාංග හෝ වෙනස් කරන්නන් යන ලිපියෙන් ඔබට ඉහත සඳහන් සියලු ගුණාංග සොයාගත හැකි අතර එය අනිවාර්යයෙන්ම ඔබට උපකාරී වනු ඇත.

  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

ARC සමඟ ශක්තිමත් වේ, ARC ට පෙර රඳවා තබා ගැනීම පෙරනිමිය විය
abdullahselek

56

පරමාණුක:

දේපල සඳහා ප්‍රවේශය පරමාණුක ආකාරයෙන් සිදු කරන බවට පරමාණුක සහතිකය. උදා: එය සෑම විටම සම්පුර්ණයෙන්ම ආරම්භ කරන ලද වස්තුවක් ආපසු ලබා දෙයි, එක් ත්‍රෙඩ් එකක ඇති ඕනෑම දේපලක් / කට්ටලයක් තවත් කෙනෙකුට ප්‍රවේශ වීමට පෙර එය සම්පූර්ණ කළ යුතුය.

පහත දැක්වෙන ශ්‍රිතය නූල් දෙකක එකවර සිදුවන බව ඔබ සිතන්නේ නම්, ප්‍රති 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;
  }

  ...
}

වාසි: සෑම අවස්ථාවකදීම සම්පුර්ණයෙන්ම ආරම්භ කරන ලද වස්තූන් නැවත පැමිණීම බහු-නූල් කිරීමේදී හොඳම තේරීම වේ.

අවාසි: කාර්ය සාධනය පහර දීම, ක්‍රියාත්මක කිරීම ටිකක් මන්දගාමී කරයි

පරමාණුක නොවන:

පරමාණුක මෙන් නොව, සෑම අවස්ථාවකදීම සම්පුර්ණයෙන්ම ආරම්භක වස්තුව නැවත පැමිණීම සහතික නොකරයි.

වාසි: ඉතා වේගයෙන් ක්‍රියාත්මක කිරීම.

අවාසි: බහු නූල් දැමීමේදී කසළ වටිනාකම ඇතිවීමේ අවස්ථා.


5
එම ප්‍රකාශය එතරම් අර්ථවත් නොවේ. ඔබට පැහැදිලි කළ හැකිද? ඔබ ඇපල් අඩවියේ උදාහරණ දෙස බැලුවහොත් පරමාණුක මූල පදය එහි ගුණාංග යාවත්කාලීන කරන අතරතුර වස්තුව සමමුහුර්ත කරයි.
ග්‍රාන්ට්

52

පළමුව පහසුම පිළිතුර: ඔබේ දෙවන උදාහරණ දෙක අතර වෙනසක් නැත. පෙරනිමියෙන්, දේපල ප්‍රවේශ කරන්නන් පරමාණුක වේ.

කසළ එකතු නොකරන ලද පරිසරයක පරමාණුක ප්‍රවේශයන් (එනම් රඳවා තබා ගැනීම / මුදා හැරීම / ස්වයංක්‍රීයව මුදා හැරීම භාවිතා කරන විට) අගුලක් භාවිතා කර වෙනත් නූලක් නිවැරදි සැකසුම / අගය ලබා ගැනීමට බාධා නොකරන බව සහතික කරයි.

තවත් තොරතුරු සඳහා සහ බහු-නූල් යෙදුම් නිර්මාණය කිරීමේදී වෙනත් කරුණු සඳහා ඇපල් හි පරමාර්ථ-සී 2.0 ප්‍රලේඛනයේ “ කාර්ය සාධනය සහ නූල් දැමීම ” කොටස බලන්න .


8
හේතු දෙකක්. පළමුවෙන්ම, සංස්ලේෂණය කළ කේතය සඳහා එය වේගයෙන් ජනනය කරයි (නමුත් නූල් ආරක්‍ෂිත කේතය නොවේ). දෙවනුව, ඔබ පරමාණුක නොවන පාරිභෝගික ප්‍රවේශයන් ලියන්නේ නම්, එය ක්‍රියාත්මක කිරීමට ඉඩ නොදී කේතය එහි අතුරුමුහුණත කියවන විට පරමාණුක නොවන බව අනාගත පරිශීලකයෙකුට විවරණය කිරීමට ඉඩ දෙයි.
ලුවී ගර්බර්ග්


31

පරමාණුක යනු විචල්‍යයට (ස්ථිතික වර්ගය) ප්‍රවේශ වන්නේ එක් නූල් එකක් පමණි. පරමාණුක නූල් ආරක්ෂිත නමුත් එය මන්දගාමී වේ.

Nonatomic යන්නෙන් බහු නූල් විචල්‍යයට (ගතික වර්ගය) ප්‍රවේශ වේ. Nonatomic යනු නූල්-අනාරක්ෂිත නමුත් එය වේගවත් ය.


14

පරමාණුක වේ නූල් ආරක්ෂිත , එය මන්දගාමී හා එය හොඳින් තහවුරු (සහතික නැත) පමණක් අගුලු දමා අගය එම කලාපයේ වඩා ප්රවේශ උත්සාහ කොපමණ නූල් උනත් සපයනු ලබන බව. පරමාණුක භාවිතා කරන විට, මෙම ශ්‍රිතය තුළ ලියා ඇති කේත කැබැල්ලක් විවේචනාත්මක කොටසේ කොටසක් බවට පත්වන අතර වරකට එක් නූල් එකක් පමණක් ක්‍රියාත්මක කළ හැකිය.

එය නූල් ආරක්ෂාව පමණක් සහතික කරයි; එය සහතික නොකරයි. මා අදහස් කළේ ඔබ ඔබේ මෝටර් රථය සඳහා විශේෂ driver රියදුරෙකු කුලියට ගැනීමයි, නමුත් එය මෝටර් රථයට අනතුරක් සිදු නොවන බවට සහතික නොවේ. කෙසේ වෙතත්, සම්භාවිතාව අවම වශයෙන් පවතී.

පරමාණුක - එය බිඳ දැමිය නොහැක, එබැවින් ප්‍රති result ලය බලාපොරොත්තු වේ. Nonatomic සමඟ - වෙනත් නූලක් මතක කලාපයට පිවිසෙන විට එය වෙනස් කළ හැකිය, එබැවින් ප්‍රති result ලය අනපේක්ෂිත වේ.

කේත කතාව:

දේපල නූල් පරමාණුක සාදන්නා සහ සැකසීම ආරක්ෂිතයි. උදාහරණයක් ලෙස ඔබ ලියා ඇත්නම්:

self.myProperty = value;

නූල් ආරක්ෂිතයි.

[myArray addObject:@"Abc"] 

නූල් ආරක්ෂිත නොවේ.


අවසාන ඡේදය පැමිණෙන්නේ කෙසේදැයි මම නොදනිමි, නමුත් එය සරල වැරැද්දකි, "පුද්ගලික පිටපත" වැනි දෙයක් නොමැත.
උපරිම

13

එවැනි පරමාණුක "පරමාණුක" නැත

@property(atomic, retain) UITextField *userName;

ඉහත සඳහන් ආකාරයට අපට භාවිතා කළ හැකිය

@property(retain) UITextField *userName;

ශුද්ධාසනයේ Stack පමාණය ප්රශ්නය මම @property භාවිතා කරන්නේ නම් මම ප්රශ්න ලැබෙන්නේ (පරමාණුක, රඳවා) NSString * myString .


10
"එවැනි මූල පදයක් ඇත", පෙරනිමියෙන් මූලික පදය අවශ්‍ය නොවන අතර පෙරනිමි අගය පවා යතුරු පදය නොපවතින බව අදහස් නොකෙරේ.
මතතිජන්

4
මෙය වැරදිය. මූල පදය පවතී. මෙම පිළිතුර නොමඟ යවන සුළු වන අතර එය ඉවත් කිරීමට මම උනන්දු කරමි.
sethfri

12

පරමාණුක (පෙරනිමි)

පරමාණුක යනු පෙරනිමියයි: ඔබ කිසිවක් ටයිප් නොකරන්නේ නම්, ඔබේ දේපල පරමාණුක වේ. පරමාණුක දේපලක් ඔබ එයින් කියවීමට උත්සාහ කළහොත් ඔබට වලංගු වටිනාකමක් ලැබෙනු ඇති බවට සහතික වේ. එම අගය කුමක් විය හැකිද යන්න පිළිබඳව එය කිසිදු සහතිකයක් ලබා නොදේ, නමුත් ඔබට හොඳ දත්ත නැවත ලැබෙනු ඇත. මෙය ඔබට කිරීමට ඉඩ දෙන්නේ ඔබට එක් විචල්‍යයකට යොමු වන බහු නූල් හෝ බහු ක්‍රියාදාමයන් තිබේ නම්, එක් නූල් කියවිය හැකි අතර තවත් නූල් ලිවිය හැකිය. ඒවා එකවර පහර දුන්නොත්, පා values ​​කයාගේ නූල් අගයන් දෙකෙන් එකක් ලබා ගැනීමට සහතික වේ: වෙනස් වීමට පෙර හෝ වෙනස් වීමෙන් පසුව. පරමාණුක ඔබට ලබා නොදෙන දෙය නම් ඔබට ලැබිය හැකි එම අගයන්ගෙන් කවර හෝ සහතිකයක්. පරමාණුක ඇත්තෙන්ම නූල්-ආරක්ෂිත වීම සමඟ ව්‍යාකූල වී ඇති අතර එය නිවැරදි නොවේ. ඔබේ නූල් ආරක්ෂාව වෙනත් ආකාරවලින් සහතික කළ යුතුය.

nonatomic

අනෙක් පැත්තෙන් පරමාණුක නොවන, ඔබට අනුමාන කළ හැකි පරිදි, “එම පරමාණුක දේ නොකරන්න” යන්නයි. ඔබට අහිමි වන දෙය නම් ඔබ සැමවිටම යමක් ආපසු ලබා ගන්නා බවට සහතික වීමයි. ඔබ ලිවීමක් මධ්‍යයේ කියවීමට උත්සාහ කරන්නේ නම්, ඔබට කසළ දත්ත ආපසු ලබා ගත හැකිය. නමුත්, අනෙක් අතට, ඔබ ටිකක් වේගයෙන් යන්න. පරමාණුක ගුණාංග මඟින් ඔබට වටිනාකමක් නැවත ලැබෙනු ඇති බවට සහතික වීම සඳහා යම් ඉන්ද්‍රජාලයක් කළ යුතු බැවින් ඒවා ටිකක් මන්දගාමී වේ. එය ඔබ බොහෝ දේ වෙත පිවිසෙන දේපලක් නම්, ඔබට එම වේගවත් ද .ුවම් නොලැබෙන බවට වග බලා ගැනීම සඳහා ඔබට nonatomic වෙත බැසීමට අවශ්‍ය විය හැකිය.

වැඩි විස්තර මෙතැනින් බලන්න: https://realm.io/news/tmi-objective-c-property-attributes/


11

මෙම පෙරනිමි වේ 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 ක් ඇති අයෙකු එය භාවිතා කළහොත් එයද බිඳ දැමිය හැකිය!


10

ඔබ ආරම්භ කිරීමට පෙර: නව ලේඛකයෙකු සිදුවීමට මතකයේ ඇති සෑම වස්තුවක්ම මතකයෙන් බැහැර කළ යුතු බව ඔබ දැන සිටිය යුතුය. ඔබ කඩදාසි මත කරන ආකාරයට යමක් මත ලිවිය නොහැක. ඔබ මුලින්ම එය මකා දැමිය යුතුය (ඩීලොක්) ඉන්පසු ඔබට එය ලිවිය හැකිය. මකාදැමීම (හෝ අඩක් සිදු කර ඇත) සහ තවමත් කිසිවක් ලියා නොමැති නම් (හෝ අඩක් ලියා ඇත) ඔබ කියවීමට උත්සාහ කරන්නේ නම් එය ඉතා ගැටළු සහගත විය හැකිය! මෙම ගැටළුවට විවිධ ආකාරවලින් ප්‍රතිකාර කිරීමට පරමාණුක හා පරමාණුක නොවන උදව් උපකාර කරයි.

පළමුව මෙම ප්‍රශ්නය කියවා බම්බම්ගේ පිළිතුර කියවන්න . ඊට අමතරව, මගේ සාරාංශය කියවන්න.


atomic සැමවිටම සහතික වනු ඇත

  • විවිධ පුද්ගලයින් දෙදෙනෙකුට එකවර කියවීමට හා ලිවීමට අවශ්‍ය නම්, ඔබේ කඩදාසි දැවී නොයනු ඇත! -> තරඟකාරී තත්වයක වුවද ඔබගේ යෙදුම කිසි විටෙකත් බිඳ වැටෙන්නේ නැත.
  • එක් පුද්ගලයෙකු ලිවීමට උත්සාහ කරන්නේ නම් සහ ලිවීමට අකුරු 8 න් 4 ක් පමණක් ලියා තිබේ නම්, පසුව කිසිවක් කියවිය නොහැක, කියවීම කළ හැක්කේ අකුරු 8 ම ලියා ඇති විට පමණි -> කියවීමක් (ලබා ගැනීම) සිදු නොවේ 'තවමත් ලියන නූල්', එනම් ලිවීමට බයිට් 8 ක් තිබේ නම් සහ බයිට් 4 ක් පමණක් ලියා තිබේ නම් - ඒ මොහොත දක්වාම ඔබට එයින් කියවීමට අවසර නැත. නමුත් එය කඩා වැටෙන්නේ නැති බව මා කී බැවින් එය ස්වයංක්‍රීයව මුදා හරින ලද වස්තුවක වටිනාකමෙන් කියවනු ඇත .
  • නම් පෙර ලියන ඔබ ඇති මීට පෙර කඩදාසි මත ලියා තිබූ පසුව කෙනෙක් ඔබට කියවීමට අවශ්ය බව මකා හැකි තවමත් කියවන්න. කෙසේද? ඔබ මැක් ඕඑස් කුණු බඳුනට සමාන දෙයකින් කියවනු ඇත (කුණු බඳුන තවමත් 100% මකා දමා නැති නිසා ... එය සීමිතය) ---> ThreadA කියවීමට නම් ThreadB ලිවීමට දැනටමත් වෙන් කර ඇති අතර, ඔබට ලැබෙනු ඇත ThreadB විසින් සම්පුර්ණයෙන්ම ලිඛිත අගයෙන් ලබා ගත් අගයක් හෝ ස්වයංක්‍රීය මුදාහැරීමේ සංචිතයෙන් යමක් ලබා ගන්න.

පරමාර්ථ-සී හි මතකය කළමනාකරණය කරන ආකාරය රඳවා ගැනීමේ ගණන් වේ. ඔබ වස්තුවක් නිර්මාණය කරන විට, එහි රඳවා ගැනීමේ ගණන 1 ක් ඇත. ඔබ වස්තුවක් රඳවා ගැනීමේ පණිවිඩයක් යවන විට, එහි රඳවා ගැනීමේ ගණන 1 කින් වැඩි වේ. ඔබ වස්තුවක් මුදා හැරීමේ පණිවිඩයක් යවන විට, එහි රඳවා ගැනීමේ ගණන 1 කින් අඩු වේ. වස්තුවකට ස්වයංක්‍රීය මුදාහැරීමේ පණිවිඩයක් යවන්න , අනාගතයේ යම් අවස්ථාවක දී එහි රඳවා ගැනීමේ ගණන 1 කින් අඩු වේ. වස්තුවක රඳවා ගැනීමේ ගණන 0 දක්වා අඩු කළ හොත් එය අවලංගු වේ.

  • නූල් ආරක්ෂාව සාක්ෂාත් කර ගැනීම සඳහා එය ප්‍රයෝජනවත් වුවද පරමාණුක නූල් ආරක්ෂාව සහතික නොකරයි . නූල් ආරක්ෂාව ඔබේ කේතය ලියන ආකාරය / ඔබ කියවන / ලියන නූල් පෝලිම් වලට සාපේක්ෂ වේ. එය සහතික කරන්නේ බිඳ වැටිය නොහැකි බහු-කියවීම පමණි.

කුමන?! බහු තෙරපීම සහ නූල් ආරක්ෂාව වෙනස්ද?

ඔව්. බහුවිධ කියවීම යන්නෙන් අදහස් වන්නේ: බහු නූල් වලට එකවර බෙදාගත් දත්ත කැබැල්ලක් කියවිය හැකි අතර අපි බිඳ වැටෙන්නේ නැත, නමුත් ඔබ ස්වයංක්‍රීය නොවන අගයකින් කියවන්නේ නැති බවට එය සහතික නොවේ. නූල් ආරක්ෂාව සමඟ, ඔබ කියවන දේ ස්වයංක්‍රීයව නිකුත් නොවන බවට සහතික වේ. පෙරනිමියෙන් අපි සෑම දෙයක්ම පරමාණුක බවට පත් නොකිරීමට හේතුව, කාර්ය සාධන පිරිවැයක් තිබීම සහ බොහෝ දේ සඳහා නූල් ආරක්ෂාව අවශ්‍ය නොවේ. අපගේ කේතයේ කොටස් කිහිපයකට එය අවශ්‍ය වන අතර එම කොටස් කිහිපය සඳහා අගුල්, මුටෙක්ස් හෝ සමමුහුර්තකරණය භාවිතා කරමින් අපගේ කේතය නූල් ආරක්ෂිත ආකාරයකින් ලිවිය යුතුය.


nonatomic

  • මැක් ඕඑස් කුණු බඳුන වැනි දෙයක් නොමැති බැවින්, ඔබට සැමවිටම වටිනාකමක් ලැබේද නැද්ද යන්න කිසිවෙකු ගණන් ගන්නේ නැත (<- මෙය බිඳවැටීමට තුඩු දිය හැකිය), නැතහොත් යමෙකු ඔබේ ලිවීමෙන් අඩක් කියවීමට උත්සාහ කළත් කිසිවෙකු ගණන් ගන්නේ නැත (කෙසේ වෙතත්) මතකයේ අඩක් ලිවීම කඩදාසි මත අඩක් ලිවීමට වඩා බෙහෙවින් වෙනස් ය, මතකයේ එය ඔබට පෙර සිටම පිස්සු මෝඩ අගයක් ලබා දිය හැකි අතර කඩදාසි මත ඔබ දකින්නේ ලියා ඇති දේවලින් අඩක් පමණි) -> බිඳ වැටීම සහතික නොවේ, මන්ද එය ස්වයංක්‍රීය මුදා හැරීමේ යාන්ත්‍රණයක් භාවිතා නොකරයි.
  • සම්පූර්ණ ලිඛිත අගයන් කියවීමට සහතික නොවේ!
  • පරමාණුවට වඩා වේගවත් වේ

සමස්තයක් වශයෙන් ඒවා අංශ 2 කින් වෙනස් වේ:

  • ස්වයංක්‍රීය මුදාහැරීමේ තටාකයක් තිබීම හෝ නොතිබීම නිසා බිඳ වැටීම හෝ නොවේ.

  • 'තවම අවසන් කර නැති හෝ හිස් අගයක්' මධ්‍යයේ නිවැරදිව කියවීමට ඉඩ දීම හෝ ඉඩ දීම සම්පූර්ණයෙන් ලියා ඇති විට පමණක් කියවීමට ඉඩ දීම .


9

ඔබ ඔබේ දේපල බහු-නූල් කේතයකින් භාවිතා කරන්නේ නම් එවිට ඔබට පරමාණුක හා පරමාණුක ගුණාංග අතර වෙනස දැකගත හැකිය. පරමාණුක පරමාණුකයට වඩා වේගවත් වන අතර පරමාණුක නූල්-ආරක්ෂිත වේ.

විජේන්ද්‍ර ත්‍රිපාති දැනටමත් බහු නූල් පරිසරයක් සඳහා උදාහරණයක් ලබා දී ඇත.


9
  • -අටෝමික් යනු විචල්‍යයට (ස්ථිතික වර්ගය) ප්‍රවේශ වන්නේ එක් නූල් එකක් පමණි.
  • -අටෝමික් නූල් ආරක්ෂිතයි.
  • නමුත් එය කාර්ය සාධනය මන්දගාමී වේ

ප්‍රකාශ කරන්නේ කෙසේද:

පරමාණුක පෙරනිමිය බැවින්,

@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"]

නූල් බී සිට ,

දැන් * නම් දේපල පරමාණුක නොවේ නම්

  • එය A සඳහා "දත්ත" අගය ලබා දෙනු ඇත
  • එය B සඳහා "දත්ත" අගය ලබා දෙනු ඇත

පරමාණුක නොවන බව නූල් අනාරක්ෂිත ලෙස හඳුන්වන්නේ එබැවිනි, නමුත් සමාන්තරව ක්‍රියාත්මක වීම නිසා එය වේගයෙන් ක්‍රියාකාරී වේ

දැන් නම් නම් දේපල පරමාණුක වේ

  • එය A සඳහා "සෞරෝව්" අගය සහතික කරනු ඇත
  • එවිට එය B සඳහා "දත්ත" අගය ලබා දෙනු ඇත

පරමාණුක නූල් සේෆ් ලෙසත්, එය කියවීම-ලිවීම ආරක්ෂිත ලෙසත් හඳුන්වන්නේ එබැවිනි

එවැනි තත්ව මෙහෙයුම් අනුක්‍රමිකව සිදු කරනු ඇත. සහ කාර්ය සාධනය මන්දගාමී වේ

- Nonatomic යන්නෙන් බහු නූල් විචල්‍යයට ප්‍රවේශ වේ (ගතික වර්ගය).

- Nonatomic යනු නූල් අනාරක්ෂිත ය.

- නමුත් එය වේගවත් කාර්ය සාධනයකි

-නොනාටොමික් යනු පෙරනිමි හැසිරීමක් නොවේ, අපි දේපල ගුණාංගයේ පරමාණුක නොවන මූල පදයක් එකතු කළ යුතුය.

ස්විෆ්ට්හි දී ObjC අර්ථයෙන් ස්විෆ්ට් ගුණාංග පරමාණුක නොවන බව සනාථ කිරීම සඳහා. එක් හේතුවක් නම්, ඔබේ අවශ්‍යතාවයන් සඳහා එක් දේපල පරමාණුවක් ප්‍රමාණවත් ද යන්න ගැන ඔබ සිතීමයි.

යොමුව: https://forums.developer.apple.com/thread/25642

වැඩි විස්තර සඳහා කරුණාකර http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html වෙබ් අඩවියට පිවිසෙන්න.


4
බොහෝ බොහෝ බොහෝ maaaaany අන් අය පවසා ඇති පරිදි, atomicනැති නූල්-ආරක්ෂිත! එය නූල් ගැටළු වලට වඩා ප්‍රතිරෝධී වන නමුත් නූල් ආරක්ෂිත නොවේ. එය ඔබට සම්පූර්ණ වටිනාකමක් ලබා දෙන බව සහතික කරයි, එනම් “නිවැරදි” අගයක් (ද්විමය මට්ටම), නමුත් එය කිසිසේත් එය ඔබේ ව්‍යාපාර තර්කනය සඳහා වර්තමාන සහ “නිවැරදි” අගය බව සහතික නොකරනු ඇත (එය අතීත වටිනාකමක් විය හැකිය ඔබගේ තර්කනයෙන් වලංගු නොවේ).
ඇලෙජැන්ඩ්‍රෝ අයිවන්

7

පරමාණුක පරමාණුක (පෙරනිමි)

පරමාණුක යනු පෙරනිමියයි: ඔබ කිසිවක් ටයිප් නොකරන්නේ නම්, ඔබේ දේපල පරමාණුක වේ. පරමාණුක දේපලක් ඔබ එයින් කියවීමට උත්සාහ කළහොත් ඔබට වලංගු වටිනාකමක් ලැබෙනු ඇති බවට සහතික වේ. එම අගය කුමක් විය හැකිද යන්න පිළිබඳව එය කිසිදු සහතිකයක් ලබා නොදේ, නමුත් ඔබට හොඳ දත්ත නැවත ලැබෙනු ඇත. මෙය ඔබට කිරීමට ඉඩ දෙන්නේ ඔබට එක් විචල්‍යයකට යොමු වන බහු නූල් හෝ බහු ක්‍රියාදාමයන් තිබේ නම්, එක් නූල් කියවිය හැකි අතර තවත් නූල් ලිවිය හැකිය. ඒවා එකවර පහර දුන්නොත්, පා 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


5

පරමාණුක දේපල මඟින් නූල් කීයක් ලබා ගන්නේද යන්න නොසලකා පූර්ණ ආරම්භක අගයක් රඳවා ගැනීමට සහතික වේ.

විවිධ නූල් වලින් එකවරම එකම අගයකට ප්‍රවේශ වුවහොත් කුමක් සිදුවේද යන්න පිළිබඳව කිසිදු සහතිකයක් නොමැතිව සංස්ලේෂණය කරන ලද ප්‍රවේශයන් සරලවම අගයක් නියම කිරීම හෝ ආපසු ලබා දීම නොවන බව නොටෝමොමික් දේපල මඟින් නියම කරයි.


3

පරමාණුක යනු එක් වරකට විචල්‍යයට ප්‍රවේශ විය හැක්කේ එක් නූල් එකකට පමණි (ස්ථිතික වර්ගය). පරමාණුක නූල් ආරක්ෂිත නමුත් එය මන්දගාමී වේ.

Nonatomic යන්නෙන් අදහස් කරන්නේ බහු නූල් වලට එකවර විචල්‍යයට ප්‍රවේශ විය හැකි බවයි (ගතික වර්ගය). Nonatomic යනු නූල්-අනාරක්ෂිත නමුත් එය වේගවත් ය.


1

ඔබ පරමාණුක භාවිතා කරන්නේ නම්, එයින් අදහස් වන්නේ නූල් ආරක්ෂිත සහ කියවීමට පමණි. ඔබ nonatomic භාවිතා කරන්නේ නම්, එයින් අදහස් වන්නේ බහු නූල් විචල්‍යයට ප්‍රවේශ වන අතර නූල් අනාරක්ෂිත ය, නමුත් එය වේගයෙන් ක්‍රියාත්මක වන අතර කියවීමේ හා ලිවීමේ මෙහෙයුම් සිදු කරයි; මෙය ගතික වර්ගයකි.


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

සම්පූර්ණ ව්යාකූලත්වය සරල කිරීම සඳහා, අපි mutex අගුල තේරුම් ගනිමු.

මුටෙක්ස් අගුල, නමට අනුව, වස්තුවේ විකෘතිතාව අගුළු දමයි. එබැවින් වස්තුවකට පන්තියකට ප්‍රවේශ වුවහොත් වෙනත් කිසිදු පන්තියකට එකම වස්තුවකට ප්‍රවේශ විය නොහැක.

IOS හි, @sychroniseමූටෙක්ස් අගුලද සපයයි .දැන් එය FIFO මාදිලියේ සේවය කරන අතර එකම අවස්ථාව බෙදා ගන්නා පන්ති දෙකකින් ප්‍රවාහයට බලපෑමක් නොවන බව සහතික කරයි. කෙසේ වෙතත්, කාර්යය ප්‍රධාන ත්‍රෙඩ් එකක තිබේ නම්, පරමාණුක ගුණාංග භාවිතයෙන් වස්තුවට ප්‍රවේශ වීමෙන් වළකින්න, මන්ද එය ඔබේ UI රඳවා තබාගෙන ක්‍රියාකාරිත්වය පිරිහීමට ලක්විය හැකිය.


-1

පරමාණුක: NSLOCK භාවිතයෙන් නූල් අගුළු දැමීමෙන් නූල් ආරක්ෂාව සහතික කරන්න.

පරමාණුක නොවන: නූල් අගුලු දැමීමේ යාන්ත්‍රණයක් නොමැති බැවින් නූල් ආරක්ෂාව සහතික නොකරයි.


-1

පරමාණුක ගුණාංග : - පරමාණුක දේපල සමඟ පවරා ඇති විචල්‍යයකට එයින් අදහස් වන්නේ එක් නූල් ප්‍රවේශයක් පමණක් වන අතර එය නූල් ආරක්ෂිත වන අතර කාර්ය සාධන දෘෂ්ටිකෝණයෙන් හොඳ වනු ඇත, පෙරනිමි හැසිරීමක් ඇත.

පරමාණුක නොවන ගුණාංග : - පරමාණුක දේපල සමඟ පවරා ඇති විචල්‍යයකට බහු නූල් ප්‍රවේශයක් ඇති අතර එය නූල් ආරක්ෂිත නොවන අතර කාර්ය සාධන දෘෂ්ටිකෝණය මන්දගාමී වනු ඇත, පෙරනිමි හැසිරීම් ඇති අතර විවිධ නූල් දෙකක් එකවර විචල්‍යයට ප්‍රවේශ වීමට අවශ්‍ය විට එය අනපේක්ෂිත ප්‍රති .ල ලබා දෙනු ඇත.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.