【发布时间】:2013-10-21 21:20:29
【问题描述】:
是否可以(如果可以,安全)创建/使用将双指针作为参数的块?
例如:
- (void)methodWithBlock:(void (^)(NSError **error))block;
其他背景、研究和问题:
- 我正在使用 ARC。
- 当我声明上面的方法并尝试调用它时,XCode 自动完成我的方法调用如下:
[self methodWithBlock:^(NSError *__autoreleasing *error) {}];__autoreleasing在这里是什么意思,为什么要添加它?我认为这与 ARC 有关。 - 如果这个是可能且安全的,指针是否仍然可以像在其他任何地方一样在块中被取消引用?
- 一般而言,执行我所描述的操作与简单地将双指针作为方法参数(例如
- (void)methodWithDoublePointer:(NSError **)error;)传递之间的重要区别是什么?应该考虑哪些特殊因素(如果有的话)(再次假设这是可能的)?
【问题讨论】:
-
@verec 不是每个人都在使用 ARC...
-
但大多数人都这样做! :-)
-
是的...让我们隐藏计算机编程中最重要的部分之一,所以感觉就像魔术,就像你不应该关心,就像你不应该担心...... ^^
-
@H2CO3,值得深入阅读该线程。 Rincewind 在这里总结得很好:devforums.apple.com/message/906963#906963。 ARC 比手工编码更好地解决了绝大多数问题,但每隔一段时间,您就需要对其进行调整。并不是说它比编译器更隐藏了编程的重要部分。我可以比 clang 更好地在 NEON 中手动编写一些循环(我已经这样做了)。这并不意味着我应该使用 -O0 进行编译,所以“我完全可以控制”。那将是愚蠢的。在绝大多数情况下,关闭 ARC 也是如此。
-
gparker 还指出了与 ARC (devforums.apple.com/message/904969#904969) 的一个经常被忽视的差异。 ARC首先关注安全;然后是性能。 (没有程序比崩溃更慢。) ARC 假设您可能会在您的方法中做一些奇怪的事情,并通过一些人们并不总是手动包含的额外保留来防止这种情况发生。在一些紧密的循环中,这可能是一个问题(我还看到很多应用程序崩溃的情况,因为人们没有把它们放进去)。对于高性能循环,我通常使用 C,但这并不意味着我大部分时间都避免使用 ObjC。
标签: objective-c objective-c-blocks