相关疑难解决方法(0)

"__block"关键字是什么意思?

__blockObjective-C 中的关键字究竟是什么意思?我知道它允许你修改块内的变量,但我想知道......

  1. 它究竟是什么告诉编译器的?
  2. 它还有什么用吗?
  3. 如果就是这样,那么为什么首先需要呢?
  4. 是在任何地方的文档?(我找不到).

objective-c ios objective-c-blocks

435
推荐指数
5
解决办法
10万
查看次数

在实现API时,如何避免在块中捕获self?

我有一个工作的应用程序,我正在努力将其转换为Xcode 4.2中的ARC.其中一个预检警告涉及self强烈捕获导致保留周期的块.我已经制作了一个简单的代码示例来说明问题.我相信我理解这意味着什么,但我不确定实现这种情况的"正确"或推荐方法.

  • self是MyAPI类的一个实例
  • 下面的代码被简化为仅显示与我的问题相关的对象和块的交互
  • 假设MyAPI从远程源获取数据,MyDataProcessor处理该数据并生成输出
  • 处理器配置有块以通信进度和状态

代码示例:

// code sample
self.delegate = aDelegate;

self.dataProcessor = [[MyDataProcessor alloc] init];

self.dataProcessor.progress = ^(CGFloat percentComplete) {
    [self.delegate myAPI:self isProcessingWithProgress:percentComplete];
};

self.dataProcessor.completion = ^{
    [self.delegate myAPIDidFinish:self];
    self.dataProcessor = nil;
};

// start the processor - processing happens asynchronously and the processor is released in the completion block
[self.dataProcessor startProcessing];
Run Code Online (Sandbox Code Playgroud)

问题:我在做什么"错误"和/或如何修改它以符合ARC惯例?

objective-c ios objective-c-blocks automatic-ref-counting

222
推荐指数
6
解决办法
8万
查看次数

ARC __block和__weak

假设我正在尝试self从块内访问:

[someObject successBlock:^(NSArray *result) {
    [self someSuccessMethod];
} failure:^(NSString *errorMessage, int status) {
    [self someFailureMethod];
}];
Run Code Online (Sandbox Code Playgroud)

我知道这会创建一个保留周期,someObject并且self永远不会被取消分配.

令我感到困惑的是,有/没有__block关键字的实际情况.我可以通过__weak引用self 来修复保留周期:

__weak MyClass* me = self;
[someObject successBlock:^(NSArray *result) {
    [me someSuccessMethod];
} failure:^(NSString *errorMessage, int status) {
    [me someFailureMethod];
}];
Run Code Online (Sandbox Code Playgroud)

我不需要在__block这里使用,因为我不是想me在块内修改.根据我的理解,如果我不使用__block,me则在块内引用副本.我的问题是:如果块中引用的内容只是对象的副本,为什么原始代码块会创建保留周期?我猜这个引用self只是一个副本,因为我从不使用__block关键字.我错误地想到了这个吗?

objective-c ios automatic-ref-counting

8
推荐指数
1
解决办法
5294
查看次数