Ποια είναι η διαφορά μεταξύ των ατομικών και nonatomic ιδιότητες;

ψήφοι
1k

Τι atomicκαι nonatomicεννοώ σε δηλώσεις ιδιοκτησίας;

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

Ποια είναι η λειτουργική διαφορά μεταξύ αυτών των τριών;

Δημοσιεύθηκε 26/02/2009 στις 03:31
πηγή χρήστη
Σε άλλες γλώσσες...                            


27 απαντήσεις

ψήφοι
1k

Οι δύο τελευταίες είναι ίδιες? «ατομικό» είναι η προεπιλεγμένη συμπεριφορά ( σημειώστε ότι δεν είναι στην πραγματικότητα μια λέξη-κλειδί? διευκρινίζεται μόνο από την απουσία τουnonatomic - atomicπροστέθηκε ως λέξη-κλειδί σε πρόσφατες εκδόσεις του LLVM / κλαγγή).

Υποθέτοντας ότι είστε @synthesizing τις εφαρμογές της μεθόδου, ατομική έναντι μη ατομικό αλλαγές το παραγόμενο κώδικα. Αν γράφετε τη δική σας setter / κτήτορες, ατομική / nonatomic / διατήρηση / εκχωρήσετε / αντιγραφής είναι απλώς συμβουλευτικό. (Σημείωση: @synthesize είναι τώρα η προεπιλεγμένη συμπεριφορά στις πρόσφατες εκδόσεις του LLVM Επίσης, δεν υπάρχει ανάγκη να δηλώσει παράδειγμα μεταβλητές? Θα συντεθούν αυτόματα, πάρα πολύ, και θα έχουν ένα. _Προταχθεί το όνομά τους για να αποφύγετε την κατά λάθος άμεση πρόσβαση).

Με το «ατομικό», το συντιθέμενο setter / δεσμευτή θα εξασφαλίσει ότι μια ολόκληρη τιμή είναι πάντα επιστρέφεται από τον συλλέκτη ή καθορίζεται από το ρυθμιστή, ανεξάρτητα από setter δραστηριότητας σε οποιοδήποτε άλλο νήμα. Δηλαδή, εάν το νήμα Α είναι στη μέση του συλλέκτη, ενώ το νήμα Β αποκαλεί τον ρυθμιστή, μια πραγματική βιώσιμη αξία - ένα autoreleased αντικείμενο, πιθανότατα - θα πρέπει να επιστραφεί στον καλούντα στην Α

Σε nonatomic, οι εν λόγω εγγυήσεις γίνονται. Έτσι, nonatomicείναι πολύ πιο γρήγορα από ό, τι «ατομική».

Τι «ατομική» δεν δεν κάνει είναι να παρέχουμε εγγυήσεις για την ασφάλεια νήμα. Αν το νήμα Α καλώντας το συλλέκτη ταυτόχρονα με το νήμα Β και Γ καλώντας το setter με διαφορετικές τιμές, το νήμα Α μπορεί να πάρει οποιαδήποτε από τις τρεις τιμές επέστρεψαν - το ένα πριν από οποιεσδήποτε setters να ονομάζεται ή είτε των τιμών πέρασαν στα setters σε Β και C. Παρομοίως, το αντικείμενο μπορεί να καταλήξει με την τιμή από Β ή Γ, δεν υπάρχει τρόπος να πει.

Η εξασφάλιση της ακεραιότητας των δεδομένων - ένας από τους πρωταρχικούς προκλήσεις των multi-threaded προγραμματισμού - επιτυγχάνεται με άλλα μέσα.

Προσθέτοντας σε αυτό:

atomicity από ένα μόνο ακίνητο, επίσης, δεν μπορεί να εγγυηθεί την ασφάλεια νήμα, όταν πολλαπλές εξαρτάται από ακίνητα είναι στο παιχνίδι.

Σκεφτείτε:

 @property(atomic, copy) NSString *firstName;
 @property(atomic, copy) NSString *lastName;
 @property(readonly, atomic, copy) NSString *fullName;

Στην περίπτωση αυτή, το νήμα Α θα μπορούσε να τη μετονομασία του αντικειμένου καλώντας setFirstName:και στη συνέχεια καλώντας setLastName:. Εν τω μεταξύ, το νήμα Β μπορεί να καλέσει fullNameστο μεταξύ δύο κλήσεων νήμα Α και θα λάβετε το νέο όνομα σε συνδυασμό με το παλιό επώνυμο.

Για να αντιμετωπιστεί αυτό, θα πρέπει να έχετε ένα συναλλαγής μοντέλο . Δηλαδή κάποιο άλλο είδος συγχρονισμού ή / και αποκλεισμού που επιτρέπει σε κάποιον να αποκλείσει την πρόσβαση σε fullNameενώ οι εξαρτώμενες ιδιότητες ενημερώνονται.

Απαντήθηκε 26/02/2009 στις 07:40
πηγή χρήστη

ψήφοι
341

Αυτό εξηγείται της Apple τεκμηρίωση , αλλά κάτω είναι μερικά παραδείγματα για το τι πραγματικά συμβαίνει. Σημειώστε ότι δεν υπάρχει «ατομική» λέξη-κλειδί, αν δεν καθορίσετε «nonatomic» τότε το ακίνητο είναι ατομική, αλλά την ένδειξη «ατομική» σαφώς θα οδηγήσει σε σφάλμα.

//@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.

Υπάρχουν πράγματι ένας μεγάλος αριθμός από διαφορετικές παραλλαγές για το πώς αυτά τα πράγματα εργασία ανάλογα με το αν οι ιδιότητες είναι βαθμωτές τιμές ή αντικείμενα, και πώς να διατηρήσουν, αντίγραφο, μόνο για ανάγνωση, nonatomic, κ.λπ. αλληλεπιδρούν. Σε γενικές γραμμές οι συνθέτες ακινήτου μόνο που ξέρουν πώς να κάνουν το «σωστό» για όλους τους συνδυασμούς.

Απαντήθηκε 26/02/2009 στις 07:24
πηγή χρήστη

ψήφοι
147

Ατομικός

  • είναι η προεπιλεγμένη συμπεριφορά
  • θα εξασφαλίσει την παρούσα διαδικασία ολοκληρώνεται από την CPU, πριν μια άλλη διαδικασία προσβάσεις τη μεταβλητή
  • δεν είναι γρήγορη, δεδομένου ότι εξασφαλίζει η διαδικασία ολοκληρωθεί εντελώς

Μη Ατομικής

  • ΔΕΝ είναι η προεπιλεγμένη συμπεριφορά
  • ταχύτερη (για συνετέθη κώδικα, δηλαδή, για μεταβλητές που δημιουργούνται χρησιμοποιώντας @property και @synthesize)
  • Δεν νήμα-ασφαλή
  • μπορεί να οδηγήσει σε μη αναμενόμενη συμπεριφορά, όταν δύο διαφορετικά διαδικασίας πρόσβαση στην ίδια μεταβλητή την ίδια στιγμή
Απαντήθηκε 25/05/2012 στις 11:56
πηγή χρήστη

ψήφοι
124

Ο καλύτερος τρόπος για να κατανοήσουμε τη διαφορά χρησιμοποιώντας το ακόλουθο παράδειγμα.

Ας υποθέσουμε ότι υπάρχει μια ατομική ιδιοκτησία σειρά που ονομάζεται «όνομα», και αν σας καλέσουν [self setName:@"A"]από το νήμα Α, καλέστε [self setName:@"B"]από το νήμα Β, και να καλέσει [self name]από το νήμα C, τότε όλες οι λειτουργίες σε διαφορετικά θέματα που θα πραγματοποιηθεί σειρά που σημαίνει ότι αν ένα νήμα εκτελεί μια setter ή κτήτορας, τότε άλλα θέματα θα περιμένει.

Το γεγονός αυτό καθιστά το ακίνητο «όνομα» ανάγνωσης / εγγραφής ασφαλές, αλλά αν ένα άλλο νήμα, D, καλεί [name release]ταυτόχρονα τότε αυτή η λειτουργία μπορεί να προκαλέσει μια σύγκρουση, διότι δεν υπάρχει καμία κλήση setter / κτήτορας που εμπλέκονται εδώ. Που σημαίνει ότι έχει διαβάσει ένα αντικείμενο / γράφετε ασφαλή (ΑΤΟΜΙΚΗΣ), αλλά δεν το νήμα-ασφαλή και άλλα θέματα που μπορεί ταυτόχρονα να στείλει κάθε είδους μηνύματα στο αντικείμενο. Ο κύριος του έργου θα πρέπει να διασφαλίζει το νήμα-ασφάλειας για τέτοια αντικείμενα.

Αν το ακίνητο «όνομα» ήταν nonatomic, τότε όλα τα σπειρώματα στο παραπάνω παράδειγμα - Α, Β, Γ και Δ θα εκτελέσει ταυτόχρονα την παραγωγή οποιασδήποτε απρόβλεπτη αποτέλεσμα. Σε περίπτωση ατομικής, είτε ένα από τα Α, Β ή Γ θα εκτελέσει πρώτα, αλλά D μπορεί ακόμα να εκτελέσει παράλληλα.

Απαντήθηκε 31/01/2012 στις 19:36
πηγή χρήστη

ψήφοι
108

Η σύνταξη και η σημασιολογία είναι ήδη καθορισμένες από άλλες εξαιρετικές απαντήσεις σε αυτή την ερώτηση. Επειδή η εκτέλεση και η απόδοση δεν είναι λεπτομερώς καλά, θα ήθελα να προσθέσω την απάντησή μου.

Ποια είναι η λειτουργική διαφορά μεταξύ αυτών των 3;

Είχα πάντα θεωρείται ατομική ως προεπιλογή αρκετά περίεργο. Σε επίπεδο αφαίρεσης που εργάζονται σε, χρησιμοποιώντας ατομικό ιδιότητες για μια τάξη ως μέσο για την επίτευξη 100% νήμα-ασφάλειας είναι μια περίπτωση γωνία. Για πραγματικά σωστή multi-threaded προγράμματα, παρέμβαση από τον προγραμματιστή είναι σχεδόν βέβαιο ότι μια απαίτηση. Εν τω μεταξύ, τα χαρακτηριστικά των επιδόσεων και της εκτέλεσης δεν έχουν ακόμη λεπτομερώς στο βάθος. Έχοντας γράψει μερικά βαριά multi-threaded προγράμματα αυτά τα χρόνια, είχα την κήρυξη ιδιότητες μου ως nonatomicτο σύνολο του χρόνου, επειδή ατομικό δεν ήταν λογικό για οποιοδήποτε σκοπό. Κατά τη συζήτηση των λεπτομερειών της ατομικής και nonatomic ιδιότητες αυτό το θέμα , έκανα μερικά προφίλ που αντιμετωπίζουν κάποια περίεργα αποτελέσματα.

Εκτέλεση

Εντάξει. Το πρώτο πράγμα που θέλω να ξεκαθαρίσω είναι ότι η εφαρμογή ασφάλισης είναι η εφαρμογή καθορισμένες και αντλείται. Louis χρησιμοποιεί @synchronized(self)το παράδειγμα του - έχω δει αυτό ως μια κοινή πηγή σύγχυσης. Η εφαρμογή δεν πραγματικά να χρησιμοποιήσετε @synchronized(self)? χρησιμοποιεί το επίπεδο αντικειμένου κλειδαριές γύρισμα . Εικονογράφηση Louis είναι καλό για μια εικόνα υψηλού επιπέδου χρησιμοποιώντας κατασκευάσματα είμαστε όλοι εξοικειωμένοι με, αλλά είναι σημαντικό να γνωρίζουμε ότι δεν χρησιμοποιεί @synchronized(self).

Μια άλλη διαφορά είναι ότι οι ατομικοί ιδιότητες θα διατηρήσει / κύκλο κυκλοφορίας αντικείμενα σας μέσα στο συλλέκτη.

Εκτέλεση

Εδώ είναι το ενδιαφέρον μέρος: Επιδόσεις με τη χρήση ατομικής ιδιοκτησίας πρόσβαση σε μη αμφισβητούμενες (π.χ. single-threaded) περιπτώσεις μπορεί να είναι πραγματικά πολύ γρήγορα σε ορισμένες περιπτώσεις. Σε λιγότερο από ιδανικές περιπτώσεις, η χρήση της ατομικής προσβάσεων μπορεί να κοστίσει περισσότερο από 20 φορές η επιβάρυνση της nonatomic. Ενώ η προσβαλλόμενος περίπτωση χρησιμοποίησης 7 σπειρώματα ήταν 44 φορές πιο αργά για την struct τριών-byte (2.2 GHz Core i7 Quad Core, x86_64). Το struct τρεις-byte είναι ένα παράδειγμα ενός πολύ αργή ιδιοκτησίας.

Ενδιαφέρουσα πλευρά σημείωση: καθορίζονται από το χρήστη accessors του struct τριών byte ήταν 52 φορές πιο γρήγορα από ό, τι τα συντίθεται ατομική accessors? ή 84% η ταχύτητα του συντεθεί nonatomic accessors.

Αντικείμενα στην προσβαλλόμενη περιπτώσεις μπορεί να υπερβαίνει το 50 φορές.

Λόγω του αριθμού των βελτιστοποιήσεις και παραλλαγές σε εφαρμογές, είναι αρκετά δύσκολο να μετρηθεί πραγματικό κόσμο επιπτώσεις σε αυτά τα πλαίσια. Μπορείτε να ακούσετε συχνά κάτι σαν «να εμπιστευθείτε, εκτός και αν το προφίλ και το θεωρούν ένα πρόβλημα». Λόγω του επιπέδου αφαίρεσης, είναι πραγματικά πολύ δύσκολο να μετρήσει την πραγματική επίπτωση. Σταχυολόγηση πραγματικό κόστος από τα προφίλ μπορεί να είναι πολύ χρονοβόρα, και λόγω αφαιρέσεις, αρκετά ανακριβής. Επίσης, ARC vs MRC μπορεί να κάνει μια μεγάλη διαφορά.

Ας βήμα πίσω, δεν επικεντρώνεται στην εφαρμογή της περιουσίας προσβάσεων, θα περιλαμβάνουν τις συνήθεις ύποπτοι, όπως objc_msgSendκαι να εξετάσει κάποιες πραγματικού κόσμου αποτελέσματα υψηλού επιπέδου για πολλές κλήσεις σε έναν NSStringσυλλέκτη σε μη αμφισβητούμενες περιπτώσεις (τιμές σε δευτερόλεπτα):

  • MRC | nonatomic | υλοποιούνται χειροκίνητα getters: 2
  • MRC | nonatomic | συντέθηκε κτήτορας: 7
  • MRC | ατομική | συντέθηκε κτήτορας: 47
  • ARC | nonatomic | συντίθεται κτήτορας: 38 (σημείωση: ARC για την προσθήκη διαιτητή καταμέτρηση ποδηλασία εδώ)
  • ARC | ατομική | συντέθηκε κτήτορας: 47

Όπως ίσως έχετε μαντέψει, ο αριθμός αναφοράς της ραδιενέργειας / ποδηλασία είναι μια σημαντική συμβολή με Atomics και κάτω από ARC. Θα δείτε επίσης μεγαλύτερες διαφορές στην προσβαλλόμενη περιπτώσεις.

Αν και να δώσει ιδιαίτερη προσοχή στην απόδοση, μπορώ ακόμα να πω σημασιολογία Πρώτη! . Εν τω μεταξύ, η απόδοση είναι χαμηλή προτεραιότητα για πολλά έργα. Ωστόσο, γνωρίζοντας τις λεπτομέρειες εκτέλεσης και το κόστος των τεχνολογιών που χρησιμοποιούν σίγουρα δεν βλάπτει. Θα πρέπει να χρησιμοποιήσετε την κατάλληλη τεχνολογία για τις ανάγκες σας, τους σκοπούς και τις ικανότητες. Ας ελπίσουμε ότι αυτό θα σας σώσει μερικές ώρες συγκρίσεις και να σας βοηθήσει να κάνετε μια καλύτερη τεκμηριωμένη απόφαση κατά το σχεδιασμό των προγραμμάτων σας.

Απαντήθηκε 18/08/2012 στις 10:47
πηγή χρήστη

ψήφοι
88

Ατομικής = ασφαλείας νήμα

Μη ατομικής = Όχι ασφαλείας νήμα

ασφάλεια Θέμα:

μεταβλητές παράδειγμα είναι το νήμα-ασφαλή αν συμπεριφέρονται σωστά όταν έχετε πρόσβαση από πολλαπλά threads, ανεξάρτητα από τον προγραμματισμό ή τη διεμπλοκή της εκτέλεσης αυτών των νημάτων από το περιβάλλον εκτέλεσης, και χωρίς επιπλέον συγχρονισμού ή άλλα συντονισμό εκ μέρους του κωδικού κλήσης.

Σε αυτό το πλαίσιο μας:

Αν ένα νήμα αλλάζει την αξία του παράδειγμα, η αλλαγμένη τιμή είναι διαθέσιμη σε όλα τα θέματα, και μόνο ένα νήμα να αλλάξετε την τιμή σε μια στιγμή.

Που να χρησιμοποιήσετε atomic:

αν η μεταβλητή παράδειγμα είναι gonna να έχει πρόσβαση σε ένα multi-threaded περιβάλλον.

Επιπτώσεις της atomic:

Όχι τόσο γρήγορα όσο nonatomicεπειδή nonatomicδεν απαιτεί καμία δουλειά φύλακας σε αυτό από το χρόνο εκτέλεσης.

Που να χρησιμοποιήσετε nonatomic:

Αν η μεταβλητή περίπτωση δεν είναι gonna να αλλάξει από πολλαπλά threads μπορείτε να το χρησιμοποιήσετε. Βελτιώνει την απόδοση.

Απαντήθηκε 10/07/2013 στις 14:07
πηγή χρήστη

ψήφοι
67

Βρήκα ένα πολύ καλά κάνει επεξήγηση των ατομικών και μη ατομικών ιδιοτήτων εδώ . Εδώ είναι μερικές σχετικό κείμενο από τον ίδιο:

«ατομικό» σημαίνει ότι δεν μπορεί να αναλυθεί. Όσον αφορά / προγραμματισμού OS μια ατομική κλήση της συνάρτησης είναι κάτι που δεν μπορεί να διακοπεί - ολόκληρη η λειτουργία πρέπει να εκτελεστεί, και δεν αντάλλαξαν έξω από την CPU από το συνηθισμένο πλαίσιο του OS της μεταγωγής μέχρι να είναι πλήρης. Ακριβώς σε περίπτωση που δεν ξέρατε: αφού η CPU μπορεί να κάνει μόνο ένα πράγμα τη φορά, το λειτουργικό σύστημα περιστρέφεται πρόσβαση στο CPU σε όλες τις διεργασίες που εκτελούνται σε λίγο χρόνο-φέτες, για να δώσει την ψευδαίσθηση του multitasking. Το χρονοδιάγραμμα της CPU μπορεί (και κάνει) να διακόψει μια διαδικασία σε οποιοδήποτε σημείο στην εκτέλεσή του - ακόμα και στα μέσα κλήση συνάρτησης. Έτσι, για δράσεις όπως η ενημέρωση των κοινόχρηστων πάγκο μεταβλητές όπου οι δύο διαδικασίες θα μπορούσε να προσπαθήσει να ενημερώσετε τη μεταβλητή την ίδια στιγμή, θα πρέπει να εκτελούνται «ατομικά», δηλαδή, κάθε ενέργεια ενημέρωση πρέπει να έχει ολοκληρωθεί στο σύνολό του πριν από οποιαδήποτε άλλη ενέργεια που μπορεί να ανταλλαχθεί πάνω στο ΕΠΕΞΕΡΓΑΣΤΗΣ.

Γι 'αυτό ήθελα να μαντέψουν ότι οι ατομικοί σε αυτή την περίπτωση σημαίνει ότι οι μέθοδοι χαρακτηριστικό αναγνώστης δεν μπορεί να διακοπεί - στην πραγματικότητα σημαίνει ότι η μεταβλητή (ες) που διαβάζουν με τη μέθοδο δεν μπορεί να αλλάξει τους ήμισυ της αξίας διαδρομή μέσα γιατί κάποιο άλλο νήμα / κλήση / λειτουργία παίρνει αντάλλαξαν επάνω στο CPU.

Επειδή οι atomicμεταβλητές δεν μπορεί να διακοπεί, η τιμή που περιέχεται από αυτούς σε οποιοδήποτε σημείο είναι (νήμα-lock) εγγυημένη για να είναι άφθαρτη , αν και, διασφαλίζοντας αυτό το κλείδωμα το νήμα καθιστά την πρόσβαση σε αυτές πιο αργή. non-atomicμεταβλητές, από την άλλη πλευρά, δεν κάνουν τέτοια εγγύηση, αλλά προσφέρουν την πολυτέλεια των ταχύτερη πρόσβαση. Για να συνοψίσω, πάει με non-atomicόταν γνωρίζετε τις μεταβλητές σας δεν θα είναι προσβάσιμες από πολλαπλά threads ταυτόχρονα και τα πράγματα επιτάχυνση.

Απαντήθηκε 24/02/2012 στις 06:17
πηγή χρήστη

ψήφοι
61

Μετά την ανάγνωση τόσα πολλά άρθρα, Stack θέσεις Υπερχείλιση και την υποβολή αιτήσεων demo για να ελέγξετε τη μεταβλητή χαρακτηριστικά ακινήτου, αποφάσισα να θέσει όλες τις πληροφορίες γνωρίσματα από κοινού:

  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 είναι η προεπιλεγμένη συμπεριφορά
    • Ατομικής accessors σε ένα μη σκουπίδια συλλέγονται περιβάλλον (δηλαδή κατά τη χρήση να διατηρούν / απελευθέρωσης / αυτόματης κυκλοφορίας) θα χρησιμοποιήσει μια κλειδαριά για να εξασφαλίσει ότι ένα άλλο νήμα δεν παρεμβαίνει με τη σωστή ρύθμιση / πάρει της αξίας.
    • Δεν είναι στην πραγματικότητα μια λέξη-κλειδί.

    Παράδειγμα:

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

    • nonatomic σημαίνει πολλαπλή πρόσβαση νήμα τη μεταβλητή (δυναμική τύπος).
    • nonatomic είναι νήμα-ανασφαλείς.
    • Αλλά είναι γρήγορο στην απόδοση
    • nonatomicΔΕΝ προεπιλεγμένη συμπεριφορά. Πρέπει να προσθέσετε τη nonatomicλέξη-κλειδί στο χαρακτηριστικό ιδιοκτησίας.
    • Μπορεί να οδηγήσει σε μη αναμενόμενη συμπεριφορά, όταν δύο διαφορετικά διεργασία (σπειρώματα) έχουν πρόσβαση στο ίδιο μεταβλητή ταυτόχρονα.

    Παράδειγμα:

        @property (nonatomic, retain) NSString *name;
    
        @synthesize name;
    
Απαντήθηκε 21/03/2013 στις 08:10
πηγή χρήστη

ψήφοι
52

Ο ευκολότερος απάντηση πρώτο: Δεν υπάρχει καμία διαφορά ανάμεσα δεύτερη δύο παραδείγματα σας. Από προεπιλογή, accessors ακίνητο είναι ατομική.

Ατομικής accessors σε ένα μη σκουπίδια συλλέγονται περιβάλλον (δηλαδή κατά τη χρήση να διατηρούν / απελευθέρωσης / αυτόματης κυκλοφορίας) θα χρησιμοποιήσει μια κλειδαριά για να εξασφαλίσει ότι ένα άλλο νήμα δεν παρεμβαίνει με τη σωστή ρύθμιση / πάρει της αξίας.

Δείτε την « Απόδοση και Threading » του Objective-C 2.0 τεκμηρίωση της Apple για κάποιο περισσότερες πληροφορίες και για άλλους λόγους κατά τη δημιουργία multi-threaded εφαρμογές.

Απαντήθηκε 26/02/2009 στις 03:56
πηγή χρήστη

ψήφοι
51

Ατομικής:

Ατομικής εγγυήσεις ότι η πρόσβαση στην ιδιοκτησία θα πραγματοποιηθεί σε ατομικό τρόπο. Για παράδειγμα, θα επιστρέφουν πάντα ένα πλήρως αρχικοποίηση αντικειμένων, κάθε get / set ενός ακινήτου σε ένα νήμα πρέπει να ολοκληρώσει πριν ένας άλλος μπορεί να έχει πρόσβαση.

Αν φανταστούμε την ακόλουθη συνάρτηση συμβαίνουν σε δύο θέματα ταυτόχρονα μπορείτε να δείτε γιατί τα αποτελέσματα δεν θα είναι αρκετά.

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

  ...
}

Πλεονεκτήματα: Επιστροφή πλήρως αρχικοποιείται αντικείμενα κάθε φορά η καλύτερη επιλογή σε περίπτωση multi-threading κάνει.

Μειονεκτήματα: χτύπημα απόδοσης, κάνει την εκτέλεση λίγο πιο αργά

Μη Ατομικής:

Σε αντίθεση Ατομικής, δεν εξασφαλίζει την πλήρη αρχικοποιηθεί αντικείμενο επιστρέφουν κάθε χρόνο.

Πλεονεκτήματα: Εξαιρετικά γρήγορη εκτέλεση.

Μειονεκτήματα: Οι πιθανότητες της αξίας σκουπιδιών σε περίπτωση multi-threading.

Απαντήθηκε 26/02/2009 στις 03:41
πηγή χρήστη

ψήφοι
31

Ατομικής σημαίνει μόνο ένα νήμα αποκτά πρόσβαση στο μεταβλητή (στατικού τύπου). Ατομικής είναι το νήμα-ασφαλή, αλλά είναι αργή.

Nonatomic σημαίνει πολλαπλά threads πρόσβαση στο μεταβλητή (δυναμική τύπος). Nonatomic είναι νήμα-ασφαλές, αλλά είναι γρήγορο.

Απαντήθηκε 22/11/2012 στις 12:20
πηγή χρήστη

ψήφοι
14

Ατομικής είναι το νήμα ασφαλής , είναι αργή και καλά διαβεβαιώνει (δεν είναι εγγυημένη) που μόνο παρέχεται η κλειδωμένη τιμή δεν έχει σημασία πόσο πολλά θέματα που επιχειρούν την πρόσβαση για την ίδια ζώνη. Κατά τη χρήση ατομικής, ένα κομμάτι του κώδικα που γράφεται στο εσωτερικό αυτής της λειτουργίας γίνεται η μέρος των ζωτικής σημασίας τμήμα, στο οποίο μόνο ένα νήμα μπορεί να εκτελέσει κάθε φορά.

Εξασφαλίζει μόνο την ασφάλεια νήμα? δεν εγγυάται ότι. Αυτό που εννοώ είναι να σας προσλάβουν έναν οδηγό εμπειρογνώμονα για το αυτοκίνητό σας, ακόμα δεν εγγυήσεις αυτοκινήτων δεν θα πληρούν ένα ατύχημα. Ωστόσο, η πιθανότητα παραμένει η παραμικρή.

Ατομική - δεν μπορεί να αναλυθεί, ώστε το αποτέλεσμα να αναμένεται. Με nonatomic - όταν ένα άλλο πρόσβασης νήμα η ζώνη μνήμης που μπορεί να το τροποποιήσει, οπότε το αποτέλεσμα είναι απροσδόκητο.

Κωδικός Συζήτηση:

Ατομικής κάνει κτήτορας και ρυθμιστής του νήματος ιδιοκτησίας ασφαλή. Για παράδειγμα, εάν u έχω γράψει:

self.myProperty = value;

είναι το νήμα ασφαλής.

[myArray addObject:@"Abc"] 

ΔΕΝ νήμα ασφαλής.

Απαντήθηκε 07/07/2015 στις 09:56
πηγή χρήστη

ψήφοι
12

Δεν υπάρχει τέτοια λέξη-κλειδί «ατομική»

@property(atomic, retain) UITextField *userName;

Μπορούμε να χρησιμοποιήσουμε το παραπάνω, όπως

@property(retain) UITextField *userName;

Δείτε ερώτημα Υπερχείλιση στοίβας παίρνω θέματα, αν μπορώ να χρησιμοποιήσω @property (ατομική, διατηρούν) NSString * myString .

Απαντήθηκε 08/11/2011 στις 06:41
πηγή χρήστη

ψήφοι
11

Η προεπιλογή είναι atomic, αυτό σημαίνει ότι δεν σας κοστίσει απόδοση κάθε φορά που χρησιμοποιείτε την ιδιοκτησία, αλλά είναι ασφαλές το νήμα. Τι Objective-C έχει, έχει οριστεί μια κλειδαριά, έτσι ώστε μόνο το πραγματικό νήμα μπορεί να έχει πρόσβαση στο μεταβλητή, εφ 'όσον ο ρυθμιστής / κτήτορας εκτελείται.

Παράδειγμα με MRC ενός ακινήτου με _internal 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;

Οι λέξεις-κλειδιά δεν πρέπει να γραφτεί ως χαρακτηριστικό την πρώτη ιδιοκτησία καθόλου.

Μην ξεχνάτε, αυτό δεν σημαίνει ότι το ακίνητο στο σύνολό της είναι το νήμα-ασφαλή. Μόνο η μέθοδος κλήσης του ρυθμιστή / κτήτορας είναι. Αλλά αν χρησιμοποιήσετε ένα setter και μετά από αυτό το κτήτορας ταυτόχρονα με 2 διαφορετικά θέματα, θα μπορούσε να σπάσει πάρα πολύ!

Απαντήθηκε 27/09/2013 στις 10:43
πηγή χρήστη

ψήφοι
9

ατομική (προεπιλογή)

Ατομικής είναι η προεπιλογή: αν δεν πληκτρολογήσετε τίποτα, ιδιοκτησία σας είναι ατομική. Η ατομική ιδιοκτησία είναι εγγυημένο ότι αν προσπαθήσετε να διαβάσετε από αυτό, θα πάρετε πίσω μια έγκυρη τιμή. Δεν κάνει καμία εγγύηση για το τι θα μπορούσε να είναι αυτή η τιμή, αλλά θα πάρετε πίσω καλά στοιχεία, όχι μόνο τη μνήμη σκουπίδια. Τι αυτό σας επιτρέπει να κάνετε είναι, αν έχετε πολλαπλά threads ή πολλαπλές διαδικασίες δείχνοντας μια μόνο μεταβλητή, ένα νήμα μπορεί να διαβάσει και ένα άλλο νήμα μπορεί να γράψει. Αν χτυπήσει την ίδια στιγμή, το νήμα αναγνώστης είναι εγγυημένη για να πάρει μία από τις δύο τιμές: είτε πριν από την αλλαγή ή μετά την αλλαγή. Τι ατομικό δεν σου δίνει είναι οποιοδήποτε είδος εγγύησης για το ποια από αυτές τις τιμές που μπορεί να πάρει. Ατομικής είναι πολύ συχνά συγχέεται με το να είναι νήμα-ασφαλή, και αυτό δεν είναι σωστό. Θα πρέπει να εγγυηθεί την ασφάλεια νήμα άλλους τρόπους σας. Ωστόσο, ατομικό θα εγγυηθεί ότι αν προσπαθήσετε να διαβάσετε, μπορείτε να πάρετε πίσω κάποια αξία.

nonatomic

Από την άλλη πλευρά, μη-ατομικά, όπως μπορείτε να μαντέψετε, απλά σημαίνει, «δεν το κάνουμε αυτό ατομικό πράγματα.» Τι θα χάσετε είναι η εγγύηση ότι θα έχετε πάντα πίσω κάτι. Αν προσπαθήσετε να διαβάσετε στη μέση μιας εγγραφής, θα μπορούσατε να πάρετε πίσω τα δεδομένα σκουπίδια. Αλλά, από την άλλη πλευρά, μπορείτε να πάτε λίγο πιο γρήγορα. Επειδή οι ατομικές ιδιότητες πρέπει να κάνετε κάποια μαγεία για να εγγυηθεί ότι θα πάρετε πίσω μία τιμή, που είναι λίγο πιο αργή. Αν είναι μια ιδιότητα που έχετε πρόσβαση σε μια μεγάλη, μπορεί να θέλετε να πέσει κάτω για να nonatomic για να βεβαιωθείτε ότι δεν έχουν υποστεί αυτή την ποινή ταχύτητα.

Δείτε περισσότερα εδώ: https://realm.io/news/tmi-objective-c-property-attributes/

Απαντήθηκε 23/07/2016 στις 06:34
πηγή χρήστη

ψήφοι
8
  • -Atomic σημαίνει μόνο ένα πρόσβασης κλωστή η μεταβλητή (στατικού τύπου).
  • -Atomic είναι ασφαλής νήμα.
  • -αλλά είναι αργή στην απόδοση

Πώς να δηλώσει:

Όπως ατομικό είναι προεπιλογή, ώστε,

@property (retain) NSString *name;

ΚΑΙ το αρχείο της εφαρμογής

self.name = @"sourov";

Ας υποθέσουμε ότι μια εργασία που σχετίζονται με τρεις ιδιότητες είναι

 @property (retain) NSString *name;
 @property (retain) NSString *A;
 @property (retain) NSString *B;
 self.name = @"sourov";

Όλες οι ιδιότητες λειτουργούν παράλληλα (όπως ασύγχρονα).

Αν καλέσετε «όνομα» από το νήμα Α ,

Και

Την ίδια στιγμή, αν σας καλέσει

[self setName:@"Datta"]

από νήμα Β ,

Τώρα Αν * ακίνητο όνομα είναι nonatomic στη συνέχεια,

  • Θα επιστρέψει τιμή «Datta» για το Α
  • Θα επιστρέψει τιμή «Datta» για την Β

Αυτός είναι ο λόγος που δεν ατομικής ονομάζεται το νήμα μη ασφαλή, όμως, αλλά είναι γρήγορο στην απόδοση λόγω της παράλληλης εκτέλεσης

Τώρα Αν * Το όνομά ακίνητο είναι ατομική

  • Θα εξασφαλίσει την αξία «Sourov» για το Α
  • Στη συνέχεια θα επιστρέψει τιμή «Datta» για την Β

Γι 'αυτό ατομικό ονομάζεται νήμα ασφαλή και Γι' αυτό και ονομάζεται ανάγνωσης-εγγραφής ασφαλή

Μια τέτοια λειτουργία κατάσταση θα εκτελέσει σειριακά. Και Αργή στην απόδοση

- Nonatomic σημαίνει πολλαπλή πρόσβαση νήμα τη μεταβλητή (δυναμική τύπος).

- Nonatomic είναι νήμα ανασφαλείς.

- αλλά είναι γρήγορη στην απόδοση

-Nonatomic δεν είναι το προεπιλεγμένο συμπεριφορά, θα πρέπει να προσθέσετε nonatomic λέξη-κλειδί στο χαρακτηριστικό ιδιοκτησίας.

Για Στο Swift Επιβεβαιώνοντας ότι οι ιδιότητες Swift είναι nonatomic με την έννοια ObjC. Ένας από τους λόγους είναι τόσο σκέφτεστε για το αν ανά ακίνητο ατομικότητα είναι επαρκής για τις ανάγκες σας.

Παραπομπή: https://forums.developer.apple.com/thread/25642

Δώθε περισσότερες πληροφορίες μπορείτε να επισκεφθείτε την ιστοσελίδα http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html

Απαντήθηκε 13/12/2016 στις 03:27
πηγή χρήστη

ψήφοι
8

Εάν χρησιμοποιείτε την ιδιοκτησία σας σε multi-threaded κώδικα, τότε θα είναι σε θέση να δείτε τη διαφορά μεταξύ nonatomic και ατομικών χαρακτηριστικών. Nonatomic είναι ταχύτερη από ό, τι ατομικό και ατομικό είναι το νήμα-ασφαλή, δεν nonatomic.

Vijayendra Tripathi έχει ήδη δοθεί ένα παράδειγμα για ένα πολυ-σπείρωμα περιβάλλον.

Απαντήθηκε 13/08/2014 στις 12:57
πηγή χρήστη

ψήφοι
7

Πριν ξεκινήσετε: Πρέπει να ξέρετε ότι κάθε αντικείμενο στη μνήμη πρέπει να deallocated από τη μνήμη για μια νέα εγγραφής για να συμβεί αυτό. Δεν μπορείς απλά γράψει πάνω από κάτι, όπως μπορείτε να κάνετε σε χαρτί. Θα πρέπει πρώτα να διαγράψετε (dealloc) και στη συνέχεια μπορείτε να γράψετε πάνω σ 'αυτό. Αν αυτή τη στιγμή ότι η διαγραφή γίνεται (ή το μισό γίνει) και δεν έχει ακόμη γίνει έγραψε (ή το μισό έγραψε) και θα προσπαθήσει να διαβάσει θα μπορούσε να είναι πολύ προβληματική! Ατομική και nonatomic σας βοηθήσει να αντιμετωπίζουν αυτό το πρόβλημα με διάφορους τρόπους.

Διαβάστε πρώτα αυτό το ερώτημα και στη συνέχεια διαβάστε την απάντηση Bbum του . Επιπλέον, στη συνέχεια, διαβάστε περίληψη μου.


atomic θα εγγυηθεί ΠΑΝΤΑ

  • Εάν δύο διαφορετικοί άνθρωποι θέλουν να διαβάζουν και να γράφουν την ίδια στιγμή, το χαρτί σας δεν θα είναι μόνο κάψει! -> Η αίτησή σας δεν θα συντριβή, ακόμη και σε μια κατάσταση κούρσας.
  • Εάν ένα άτομο προσπαθεί να γράψει και έχει γράψει μόνο 4 από τα 8 γράμματα για να γράψει, τότε δεν μπορεί να διαβάσει στη μέση, η ανάγνωση μπορεί να γίνει μόνο όταν όλα τα 8 γράμματα είναι γραμμένο -> Δεν ανάγνωσης (να) θα γίνει στις «ένα νήμα που εξακολουθεί να γράφει», δηλαδή αν υπάρχουν 8 bytes να bytes να γράψει, και μόνο 4 bytes γράφονται - μέχρι εκείνη τη στιγμή, δεν επιτρέπεται να διαβάζουν από αυτό. Αλλά επειδή είπα ότι δεν θα συντριβή, τότε θα διαβάσει από την αξία ενός autoreleased αντικειμένου.
  • Αν πριν από τη σύνταξη που έχουν διαγραφεί εκείνη που είχε προηγουμένως γραμμένο σε χαρτί και στη συνέχεια κάποιος θέλει να διαβάσει μπορείτε να εξακολουθούν να διαβάσετε. Πως? Θα πρέπει να διαβάζει από κάτι παρόμοιο με το Mac OS κάδο απορριμμάτων (όπως Trash bin όχι ακόμα 100% διαγραφούν είναι ... ότι βρίσκεται σε εκκρεμότητα) ---> Αν ThreadA είναι να διαβάσει, ενώ ThreadB έχει ήδη dealloced να γράψει, θα κάνατε μπορούσε είτε να πάρει αξία από το τελικό πλήρως γραπτή αξία από ThreadB ή να πάρει κάτι από αυτόματης κυκλοφορίας στην πισίνα.

Διατηρήστε μετράει είναι ο τρόπος με τον οποίο γίνεται η διαχείριση μνήμης σε Objective-C. Όταν δημιουργείτε ένα αντικείμενο, που έχει διατηρήσει καταμέτρηση των 1. Όταν στέλνετε ένα αντικείμενο ένα διατηρήσει μήνυμα, διατηρούν την καταμέτρηση του αυξάνεται κατά 1. Όταν στέλνετε ένα αντικείμενο ένα μήνυμα απελευθέρωσης, διατηρούν την καταμέτρηση του μειώνεται κατά 1. Όταν στείλτε ένα αντικείμενο μιας αυτόματης κυκλοφορίας μήνυμα , διατηρούν την καταμέτρηση του μειώνεται κατά 1 σε κάποια φάση στο μέλλον. Εάν ένας object's διατηρούν καταμέτρηση μειώνεται σε 0, είναι deallocated.

  • Ατομικής δεν εγγυάται την ασφάλεια νήμα, αν και χρήσιμη για την επίτευξη της ασφάλειας νήμα. Θέμα Ασφάλειας είναι σε σχέση με το πώς θα γράψετε τον κωδικό σας / που ουρά νήμα που διαβάζετε / γραφής από. Εγγυάται μόνο μη-crashable multithreading.

ΟΠΑ, τι?! Οι multithreading και την ασφάλεια νήμα διαφορετικό;

Ναί. Multithreading σημαίνει: πολλαπλά threads μπορεί να διαβάσει ένα κοινό κομμάτι των δεδομένων ταυτόχρονα και δεν θα συντριβή, αλλά δεν εγγυάται ότι δεν διαβάζετε από ένα μη-autoreleased αξίας. Με ασφαλείας νήμα, είναι εγγυημένο ότι αυτό που διαβάζετε δεν είναι αυτόματη κυκλοφορήσει. Ο λόγος που δεν κάνουμε τα πάντα ατομικό εξ ορισμού είναι, γιατί υπάρχει ένα κόστος επιδόσεις και για τα περισσότερα πράγματα που δεν χρειάζεστε πραγματικά ασφαλείας νήμα. Μερικά μέρη του κώδικά μας το χρειάζονται και για αυτά τα λίγα μέρη που πρέπει να γράψετε κώδικα μας σε ένα νήμα ασφαλή τρόπο χρησιμοποιώντας κλειδαριές, mutex ή συγχρονισμό.


nonatomic

  • Δεδομένου ότι δεν υπάρχει τέτοιο πράγμα όπως το Mac OS Trash Bin, τότε κανείς δεν νοιάζεται αν ή όχι θα έχετε πάντα μια τιμή (<- Αυτό θα μπορούσε να οδηγήσει σε κατάρρευση), ούτε κάποιος νοιάζεται αν κάποιος προσπαθήσει να διαβάσει στα μισά του δρόμου μέσω σας εγγράφως (αν και στα μισά του δρόμου γράφει στη μνήμη είναι πολύ διαφορετική από τη μέση γραπτώς σε χαρτί, στη μνήμη θα μπορούσε να σας δώσει μια τρελή ηλίθιο τιμή από πριν, ενώ στα χαρτιά μπορείτε να δείτε μόνο το μισό από αυτό είναι ήδη έγραψε) -> δεν εγγυάται ότι δεν συντριβή, επειδή δεν χρησιμοποιεί αυτόματης κυκλοφορίας μηχανισμό.
  • δεν εγγυάται την πλήρη γραπτή τιμές που πρέπει να διαβάσετε!
  • Είναι πιο γρήγορα από ό, τι ατομικό

Σε γενικές γραμμές είναι διαφορετικές σε 2 θέματα:

  • Κατάρρευση ή όχι, λόγω της ύπαρξης ή δεν έχει αυτόματης κυκλοφορίας στην πισίνα.

  • Η δυνατότητα να διαβάσει ακριβώς στη μέση μιας «δεν έχει ακόμη τελειώσει εγγραφής ή κενή τιμή ή να μην επιτρέπει και μόνο επιτρέπει να διαβάσετε όταν η τιμή είναι πλήρως γραμμένο.

Απαντήθηκε 28/04/2016 στις 16:18
πηγή χρήστη

ψήφοι
7

Πριν από τη συζήτηση σχετικά με τα χαρακτηριστικά των @property, θα πρέπει να γνωρίζετε ποια είναι η χρήση του @property. @property προσφέρει έναν τρόπο για να καθορίσει τις πληροφορίες που μια κατηγορία έχει ως στόχο να ενσωματώσουν. Εάν δηλώσουν ένα αντικείμενο / μεταβλητή χρησιμοποιώντας @property, τότε αυτό το αντικείμενο / μεταβλητή θα είναι προσβάσιμα σε άλλους κλάδους εισαγωγής της κατηγορίας του. Εάν δηλώσουν ένα αντικείμενο χρησιμοποιώντας @property στο αρχείο κεφαλίδας, τότε θα πρέπει να το συνθέσει χρησιμοποιώντας @synthesize στο αρχείο εφαρμογής.

Παράδειγμα:

.h κατηγορία

@interface ExampleClass : NSObject
   @property (nonatomic, retain) NSString *name;
@end

.m κατηγορία

@implementation ExampleClass
   @synthesize name;
@end

Τώρα ο compiler θα συνθέσουν accessor μεθόδους για το όνομα.

ExampleClass *newObject=[[ExampleClass alloc]init];
NSString *name1=[newObject name]; // get 'name'
[obj setName:@“Tiger”];

Κατάλογος των ιδιοτήτων των @property: ατομική. nonatomic. διατηρώ. αντίγραφο. μόνο για ανάγνωση. διαβάζω γράφω. αναθέτω. ισχυρός.

ατομικό: Είναι η προεπιλεγμένη συμπεριφορά. Αν ένα αντικείμενο έχει δηλωθεί ως ατομικό τότε γίνεται το νήμα-ασφαλή. Νήμα-ασφαλή μέσα, σε μια στιγμή μόνο ένα νήμα από ένα συγκεκριμένο υπόδειγμα της κατηγορίας αυτής μπορεί να έχει τον έλεγχο του επί του αντικειμένου.

παράδειγμα:

@property NSString *name; //by default atomic
@property (atomic)NSString *name; // explicitly declared atomic

nonatomic: Δεν είναι νήμα-ασφαλή. Μπορείτε να χρησιμοποιήσετε το nonatomic χαρακτηριστικό ακίνητο για να καθορίσετε ότι συντίθεται accessors απλά να ορίσετε ή να επιστρέψει άμεσα μια τιμή, χωρίς εγγυήσεις για το τι θα συμβεί αν το ίδιο αξία πρόσβαση γίνεται ταυτόχρονα από διαφορετικά νήματα. Για το λόγο αυτό, είναι πιο γρήγορο να αποκτήσετε πρόσβαση σε μια nonatomic ιδιοκτησίας από ένα ατομικό μία. @property (nonatomic)NSString *name;

διατηρούν: απαιτείται όταν το χαρακτηριστικό είναι ένας δείκτης σε μία μέθοδο setter object.The θα αυξήσει διατηρήσει καταμέτρηση του αντικειμένου, έτσι ώστε θα καταλαμβάνει μνήμη στην αυτόματης κυκλοφορίας πισίνα. @property (retain)NSString *name;

Αντίγραφο: Εάν χρησιμοποιείτε το αντίγραφο, δεν μπορείτε να χρησιμοποιήσετε διατηρήσει. Χρησιμοποιώντας αντίγραφο παρουσία της κλάσης θα περιέχει το δικό του αντίγραφο. Ακόμη και αν ένα μεταβλητό χορδών έχει οριστεί και στη συνέχεια άλλαξε, η παρουσία καταγράφει ό, τι αξία έχει κατά το χρόνο που έχει οριστεί. Δεν μέθοδοι setter και κτήτορας θα συντεθεί.

@property (copy) NSString *name;

NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];    
xyzObj.name = nameString;    
[nameString appendString:@"Pizza"];

μόνο για ανάγνωση: Αν δεν θέλετε να επιτρέπεται η ιδιοκτησία πρέπει να αλλάξει μέσω του ρυθμιστή μέθοδο, μπορείτε να δηλώσετε την ιδιότητα μόνο για ανάγνωση. @property (readonly) NSString *name;

ReadWrite: είναι η προεπιλεγμένη συμπεριφορά. Δεν χρειάζεται να καθορίσετε ReadWrite χαρακτηριστικό ρητά.

@property (readwrite) NSString *name;

εκχωρήσετε: θα δημιουργήσει ένα ρυθμιστή που αναθέτει την τιμή στη μεταβλητή παράδειγμα άμεσα, και όχι αντιγραφή ή η διατήρησή της. Αυτό είναι καλύτερο για πρωτόγονα είδη, όπως NSInteger και CGFloat, ή αντικείμενα που δεν σας ανήκει άμεσα, όπως συνέδρων.

@property (assign) NSInteger year;

ισχυρή: είναι μια αντικατάσταση για διατήρηση. @property (nonatomic, strong) AVPlayer *player;

unsafe_unretained: Υπάρχουν μερικά μαθήματα στο κακάο και κακάο Touch που δεν υποστηρίζουν ακόμα αδύναμη αναφορές, πράγμα που σημαίνει ότι δεν μπορεί να κηρύξει μια αδύναμη ιδιότητα ή αδύναμη τοπική μεταβλητή για να παρακολουθείτε τους. Αυτές οι κατηγορίες περιλαμβάνουν NSTextView, NSFont και NSColorSpace, κλπ. Εάν πρέπει να χρησιμοποιήσετε ένα αδύναμο αναφορά σε μία από αυτές τις κατηγορίες, θα πρέπει να χρησιμοποιήσετε μια μη ασφαλή αναφοράς. Μια μη ασφαλή αναφοράς είναι παρόμοιο με ένα αδύναμο αναφορά στο ότι δεν τηρεί σχετικό αντικείμενο ζωντανός, αλλά δεν θα πρέπει να οριστεί σε μηδέν, αν το αντικείμενο προορισμού deallocated.

@property (unsafe_unretained) NSObject *unsafeProperty;

Απαντήθηκε 18/06/2015 στις 05:25
πηγή χρήστη

ψήφοι
4

Η ατομική ιδιοκτησία εξασφαλίζει τη διατήρηση πλήρως αρχικοποιηθεί αξία, ανεξάρτητα από το πόσα θέματα που κάνουν κτήτορας και setter σε αυτό.

Η nonatomic ιδιότητα καθορίζει αυτή που συντίθεται accessors απλώς οριστεί ή να επιστρέψει μια τιμή άμεσα, χωρίς εγγυήσεις για το τι θα συμβεί αν η ίδια τιμή προσπελαστεί είναι ταυτόχρονα από διαφορετικά νήματα.

Απαντήθηκε 23/10/2015 στις 15:41
πηγή χρήστη

ψήφοι
3

Ατομικής σημαίνει μόνο ένα νήμα μπορεί να έχει πρόσβαση την μεταβλητή κάθε φορά (στατικού τύπου). Ατομικής είναι το νήμα-ασφαλή, αλλά είναι αργή.

Nonatomic σημαίνει πολλαπλά threads μπορούν να έχουν πρόσβαση στη μεταβλητή στο ίδιο χρονικό διάστημα (δυναμικές τύπου). Nonatomic είναι νήμα-ασφαλές, αλλά είναι γρήγορο.

Απαντήθηκε 01/02/2016 στις 08:27
πηγή χρήστη

ψήφοι
2

Εάν χρησιμοποιείτε ατομικό, αυτό σημαίνει ότι το νήμα θα είναι ασφαλής και είναι μόνο για ανάγνωση. Εάν χρησιμοποιείτε nonatomic, αυτό σημαίνει ότι τα πολλαπλά θέματα που έχουν πρόσβαση στο μεταβλητή και είναι το νήμα μη ασφαλή, αλλά εκτελείται γρήγορα, κάνει ανάγνωσης και εγγραφής? Αυτό είναι μια δυναμική τύπου.

Απαντήθηκε 13/02/2016 στις 13:34
πηγή χρήστη

ψήφοι
0

Ατομικότητα ατομική (προεπιλογή)

Ατομικής είναι η προεπιλογή: αν δεν πληκτρολογήσετε τίποτα, ιδιοκτησία σας είναι ατομική. Η ατομική ιδιοκτησία είναι εγγυημένο ότι αν προσπαθήσετε να διαβάσετε από αυτό, θα πάρετε πίσω μια έγκυρη τιμή. Δεν κάνει καμία εγγύηση για το τι θα μπορούσε να είναι αυτή η τιμή, αλλά θα πάρετε πίσω καλά στοιχεία, όχι μόνο τη μνήμη σκουπίδια. Τι αυτό σας επιτρέπει να κάνετε είναι, αν έχετε πολλαπλά threads ή πολλαπλές διαδικασίες δείχνοντας μια μόνο μεταβλητή, ένα νήμα μπορεί να διαβάσει και ένα άλλο νήμα μπορεί να γράψει. Αν χτυπήσει την ίδια στιγμή, το νήμα αναγνώστης είναι εγγυημένη για να πάρει μία από τις δύο τιμές: είτε πριν από την αλλαγή ή μετά την αλλαγή. Τι ατομικό δεν σου δίνει είναι οποιοδήποτε είδος εγγύησης για το ποια από αυτές τις τιμές που μπορεί να πάρει. Ατομικής είναι πολύ συχνά συγχέεται με το να είναι νήμα-ασφαλή, και αυτό δεν είναι σωστό. Θα πρέπει να εγγυηθεί την ασφάλεια νήμα άλλους τρόπους σας. Ωστόσο, ατομικό θα εγγυηθεί ότι αν προσπαθήσετε να διαβάσετε, μπορείτε να πάρετε πίσω κάποια αξία.

nonatomic

Από την άλλη πλευρά, μη-ατομικά, όπως μπορείτε να μαντέψετε, απλά σημαίνει, «δεν το κάνουμε αυτό ατομικό πράγματα.» Τι θα χάσετε είναι η εγγύηση ότι θα έχετε πάντα πίσω κάτι. Αν προσπαθήσετε να διαβάσετε στη μέση μιας εγγραφής, θα μπορούσατε να πάρετε πίσω τα δεδομένα σκουπίδια. Αλλά, από την άλλη πλευρά, μπορείτε να πάτε λίγο πιο γρήγορα. Επειδή οι ατομικές ιδιότητες πρέπει να κάνετε κάποια μαγεία για να εγγυηθεί ότι θα πάρετε πίσω μία τιμή, που είναι λίγο πιο αργή. Αν είναι μια ιδιότητα που έχετε πρόσβαση σε μια μεγάλη, μπορεί να θέλετε να πέσει κάτω για να nonatomic για να βεβαιωθείτε ότι δεν έχουν υποστεί αυτή την ποινή ταχύτητα. Πρόσβαση

ευγένεια https://academy.realm.io/posts/tmi-objective-c-property-attributes/

χαρακτηριστικά ακίνητο Ατομικότητα (ατομικό και nonatomic) δεν αντικατοπτρίζονται στην αντίστοιχη δήλωση Swift ιδιοκτησίας, αλλά οι εγγυήσεις ατομικότητα της υλοποίησης του στόχου-C εξακολουθούν να κατέχουν, όταν το εισαγόμενο ακίνητο είναι προσβάσιμο από το Swift.

Έτσι - αν ορίσετε μια ατομική ιδιοκτησία στην Objective-C θα παραμείνει ατομικό όταν χρησιμοποιείται από Swift.

ευγένεια https://medium.com/@YogevSitton/atomic-vs-non-atomic-properties-crash-course-d11c23f4366c

Απαντήθηκε 29/01/2019 στις 06:12
πηγή χρήστη

ψήφοι
0

Ατομικής ιδιότητες : - Όταν μια μεταβλητή αποδίδεται με την ατομική ιδιοκτησία, που σημαίνει ότι έχει μόνο μία πρόσβαση νήμα και θα είναι το νήμα ασφαλής και θα είναι καλό σε μια προοπτική απόδοσης, θα έχουν προεπιλεγμένη συμπεριφορά.

Μη Ατομικής Ιδιότητες : - Όταν μια μεταβλητή αποδίδεται με την ατομική ιδιοκτησία, που σημαίνει ότι έχει πολλαπλά πρόσβαση κλωστή και δεν θα το νήμα ασφαλή και θα είναι αργή στην προοπτική απόδοσης, θα έχουν προεπιλεγμένη συμπεριφορά και όταν δύο διαφορετικά θέματα που θέλετε να αποκτήσετε πρόσβαση μεταβλητή ταυτόχρονα θα δώσει απρόσμενα αποτελέσματα.

Απαντήθηκε 04/08/2018 στις 11:26
πηγή χρήστη

ψήφοι
0

Η αλήθεια είναι ότι χρησιμοποιούν κλειδαριά γύρισμα για την εφαρμογή της ατομικής ιδιοκτησίας. Ο κώδικας όπως παρακάτω:

 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);
    }
Απαντήθηκε 09/12/2016 στις 04:58
πηγή χρήστη

ψήφοι
0

Για να απλοποιηθεί το σύνολο σύγχυση ας καταλάβουμε κλείδωμα mutex lock.Mutex σύμφωνα με το όνομα κλειδώνει τη μεταβλητότητα της object.So αν το αντικείμενο είναι προσβάσιμο από μια τάξη καμία άλλη κατηγορία μπορεί να έχει πρόσβαση το ίδιο object.In iOS @sychronise επίσης να παρέχουν το mutex lock.Now που υπηρετούν σε λειτουργία FIFO και εξασφαλίζει η ροή δεν επηρεάζεται από δύο τάξεις που μοιράζονται την ίδια instance.However αν το έργο είναι σε κύριο νήμα αποφεύγουν την πρόσβαση αντικειμένου με τη χρήση ατομικών ιδιοτήτων καθώς μπορεί να κρατήσει UI σας και να υποβαθμίσει την απόδοση

Απαντήθηκε 23/09/2016 στις 18:41
πηγή χρήστη

ψήφοι
0

Ατομικής: Βεβαιωθείτε νήμα-ασφάλειας κλειδώνοντας το νήμα χρησιμοποιώντας NSLOCK.

Μη ατομικό: Δεν εξασφαλίσει το νήμα-ασφάλειας, καθώς δεν υπάρχει μηχανισμός νήμα κλειδώματος.

Απαντήθηκε 29/06/2016 στις 08:56
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more