首页 > 代码库 > IOS 类的属性修饰符atomic

IOS 类的属性修饰符atomic

  1. 在声明一个类的属性时,默认这个属性会被修饰atomic,意思是原子性访问的。

nonatomic和atomic修饰的属性,在自己没有重写setter和getter的时候才会发生作用,其主要的作用可以理解为,atomic修饰的setter和getter在多线程下面是互斥的,相当于setter和getter中开始和结束的地方加锁了。

stackoverflow上面对atomic解释赞同最多的答案:

Image

atomic不等于线程安全,对于常见的引用、指针、4字节(位宽字节)的变量,其赋值操作本身就是原子的 ,没有必要加上atomic,对于结构体类型,atomic才会起到作用。

 

 

线程安全

线程安全问题是指多个线程在读写共享的变量时造成内存紊乱的问题,解决线程安全问题就必须保证多线程读写同一变量时代码序列是串行的,保证读写过程中不会穿插执行。常用的方法除了使用线程安全方法、加锁之外,还可以将读写的代码放在同一个队列中。

apple给出了一些线程不安全的类,这些类创建的对象(变量)在多线程中访问是不安全的。通常不可改变的对象(Immutable)是线程安全的,可改变的对象不是线程安全的(mutable)。

线程安全的类:

  • NSArray

  • NSAssertionHandler

  • NSAttributedString

  • NSCalendarDate

  • NSCharacterSet

  • NSConditionLock

  • NSConnection

  • NSData

  • NSDate

  • NSDecimal functions

  • NSDecimalNumber

  • 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 functions

  • NSInvocation

  • NSJavaSetup functions

  • NSMapTable functions

  • NSMutableArray

  • 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