首页 > 代码库 > IOS 类的属性修饰符atomic
IOS 类的属性修饰符atomic
在声明一个类的属性时,默认这个属性会被修饰atomic,意思是原子性访问的。
nonatomic和atomic修饰的属性,在自己没有重写setter和getter的时候才会发生作用,其主要的作用可以理解为,atomic修饰的setter和getter在多线程下面是互斥的,相当于setter和getter中开始和结束的地方加锁了。
stackoverflow上面对atomic解释赞同最多的答案:
atomic不等于线程安全,对于常见的引用、指针、4字节(位宽字节)的变量,其赋值操作本身就是原子的 ,没有必要加上atomic,对于结构体类型,atomic才会起到作用。
线程安全
线程安全问题是指多个线程在读写共享的变量时造成内存紊乱的问题,解决线程安全问题就必须保证多线程读写同一变量时代码序列是串行的,保证读写过程中不会穿插执行。常用的方法除了使用线程安全方法、加锁之外,还可以将读写的代码放在同一个队列中。
apple给出了一些线程不安全的类,这些类创建的对象(变量)在多线程中访问是不安全的。通常不可改变的对象(Immutable)是线程安全的,可改变的对象不是线程安全的(mutable)。
线程安全的类:
NSArray
NSAssertionHandler
NSAttributedString
NSCalendarDate
NSCharacterSet
NSConditionLock
NSConnection
NSData
NSDate
NSDecimal
functionsNSDecimalNumber
NSDecimalNumberHandler
NSDeserializer
NSDictionary
NSDistantObject
NSDistributedLock
NSDistributedNotificationCenter
NSException
NSFileManager
(in OS X v10.5 and later)NSHost
NSLock
NSLog
/NSLogv
NSMethodSignature
NSNotification
NSNotificationCenter
NSNumber
NSObject
NSPortCoder
NSPortMessage
NSPortNameServer
NSProtocolChecker
NSProxy
NSRecursiveLock
NSSet
NSString
NSThread
NSTimer
NSTimeZone
NSUserDefaults
NSValue
NSXMLParser
Object allocation and retain count functions
Zone and memory functions
线程不安全的类:
NSArchiver
NSAutoreleasePool
NSBundle
NSCalendar
NSCoder
NSCountedSet
NSDateFormatter
NSEnumerator
NSFileHandle
NSFormatter
NSHashTable
functionsNSInvocation
NSJavaSetup
functionsNSMapTable
functionsNSMutableArray
NSMutableAttributedString
NSMutableCharacterSet
NSMutableData
NSMutableDictionary
NSMutableSet
NSMutableString
NSNotificationQueue
NSNumberFormatter
NSPipe
NSPort
NSProcessInfo
NSRunLoop
NSScanner
NSSerializer
NSTask
NSUnarchiver
NSUndoManager
例如这样声明的对象:
@property (nonatomic , strong) NSMutableArray * array;
array在多线程访问,比如一个线程遍历数组,另外一个线程删除或者插入元素时,程序会直接crash,提示指针异常。同样的道理,atomic修饰的属性,并不能保证多线程读写对象内部元素的安全性,因此atomic不是线程安全的。
IOS 类的属性修饰符atomic