【发布时间】:2015-12-20 19:15:56
【问题描述】:
阅读Apple's documentation 后,我尝试在Objective-C 中证明属性的原子性或非原子性。为此,我创建了一个具有名字和姓氏的 Person 类。
人.h
@interface Person : NSObject
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
- (instancetype)initWithFirstName:(NSString *)fn lastName:(NSString *)ln;
@end
人.m
@implementation Person
- (instancetype)initWithFirstName:(NSString *)fn lastName:(NSString *)ln {
if (self = [super init]) {
self.firstName = fn;
self.lastName = ln;
}
return self;
}
- (NSString *)description {
return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName];
}
@end
在另一个类中,这里是我的 AppDelegate,我有一个非原子属性,它是 Person 的一个实例。
@property (strong, nonatomic) Person *p;
在实现文件中,我创建了三个并发队列。在第一个队列中我读取了属性,在另外两个队列中我写入了不同的 person 值。
据我了解,我的日志中可能有 Bob Frost 或 Jack Sponge 输出,因为我将我的属性声明为 nonatomic。但那并没有发生。我不明白为什么。我是否遗漏了什么或误解了什么?
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
Person *bob = [[Person alloc] initWithFirstName:@"Bob" lastName:@"Sponge"];
Person *jack = [[Person alloc] initWithFirstName:@"Jack" lastName:@"Frost"];
self.p = bob;
dispatch_queue_t queue1 = dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue2 = dispatch_queue_create("queue2", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue3 = dispatch_queue_create("queue3", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue1, ^{
while (YES) {
NSLog(@"%@", self.p);
}
});
dispatch_async(queue2, ^{
while (YES) {
self.p = bob;
}
});
dispatch_async(queue3, ^{
while (YES) {
self.p = jack;
}
});
return YES;
}
【问题讨论】:
标签: ios objective-c macos atomic