【发布时间】:2014-04-03 01:40:31
【问题描述】:
考虑以下示例:
- (void)exampleFunction
{
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
SomeClass *classObject = [[SomeClass alloc] init];
[classObject someFunctionThatDoesBackgroundWorkAndCallsACompletionBlock:^(NSDictionary *results) {
SomeNeatObject *object = appDelegate.someNeatObject;
[object doSomeNeatStuff:results];
}];
}
假设完成块在主/UI线程上执行以避免额外的疯狂,这是我不确定的:
- 在块内引用变量时,appDelegate 变量是否按照正常的块规则复制到堆栈中?
- 如果#1 是,这是一种好的/安全的做法吗?如果您在随后被分派到 GCD 队列的块中执行此操作,我可能会看到这可能会导致问题,因为 .someNeatObject 可能已更改状态/变为 nil?
我意识到 appDelegate 不应该被过度使用,但是如果你使用 Apple 的模板来初始化 Core Data 堆栈(在至少在 iOS 项目上)。这种特殊情况(核心数据)让我担心,因为该堆栈的大部分不是线程安全的,复制它也不是一个好主意。
提前致谢。
【问题讨论】:
-
我什至不会将我的 CoreData 堆栈放入应用程序委托中。
-
“在块中引用 iOS 应用程序委托会创建委托对象的副本吗?”不会。一个块会保留其中使用的根对象,但它不会复制任何内容。任何事物。好吧,从技术上讲,人们可能会争辩说原语被复制了,但肯定没有对象。
-
@Kevin 我不确定(这就是我问这个问题的原因),因为 ARC 固有地复制块,并且根据苹果的文档 (developer.apple.com/library/ios/documentation/cocoa/conceptual/…),块复制引用的任何实例变量。那么对象只是递增而不是复制吗?
-
@WayneHartman 同意,但如果你使用 Apple 的默认模板,那就是卡住了。另外这只是一个例子:)
-
@MattS。我不确定你在哪里看到了关于在那里复制对象的任何信息。也许在
__block存储类型下?这会复制变量,即指针,而不是对象本身。
标签: ios objective-c macos