atomic
和noatomic
的區(qū)別是什么鳞骤?
剛剛學(xué)iOS的時候是這樣認(rèn)識的:atomic是線程安全的,但它運行效率慢,noatomic不是線程安全的它他效率高早像。看了atomic
和noatomic
內(nèi)部實現(xiàn)后才認(rèn)識到實際上atomic只是保證了seter getter方法的原子性 noatomic不能保證seter getter方法的原子性肖爵。
atomic的seter getter內(nèi)部實現(xiàn)
- (void)setCurrentImage:(UIImage *)currentImage
{
@synchronized(self) {
if (_currentImage != currentImage) {
[_currentImage release];
_currentImage = [currentImage retain];
}
}
}
- (UIImage *)currentImage
{
@synchronized(self) {
return _currentImage;
}
}
atomic的seter getter內(nèi)部實現(xiàn)是用了互斥鎖來保證seter getter方法在多線程中的安全卢鹦,但atomic修飾的對象是我們自定義的,可能并沒有加鎖劝堪,在多線程中atomic修飾對象并不能保證線程安全冀自。
nonatomic對象setter和getter方法的實現(xiàn):
- (void)setCurrentImage:(UIImage *)currentImage
{
if (_currentImage != currentImage) {
[_currentImage release];
_currentImage = [currentImage retain];
}
}
- (UIImage *)currentImage
{
return _currentImage;
}
nonatomic對象setter和getter方法的實現(xiàn)并么有加互斥鎖,所以nonatomic修飾的對象是非線程安全的秒啦,同時nonatomic對象setter和getter方法也是非線程安全的熬粗,但也正因為沒有互斥鎖所以性能要比atomic好
如果既要atomic修飾的對象線程安全也要atomic的seter getter方法具有原子性,那就需要給atomic修飾的對象加互斥鎖余境,但這會進一步降低atomic的性能驻呐。
https://academy.realm.io/posts/tmi-objective-c-property-attributes/