iphone - 访问 block 内的实例变量

标签 iphone objective-c ios ipad ios5

我有一个关于在像我这样的情况下使用异步 block 的最佳实践的问题。

例如,我有两个 Controller :(设为controller1和controller2)

我将 Controller 2插入 Controller 1:

controller2 * c = [[controller2 alloc] init];
[self.navigationController pushViewController:c animated:YES];
[c release];

controller2 有一个实例变量:

@interface controller2 : UITableViewController{
    UIImageView * imageView;
}

分配和释放它:

- (id)init{
   ...
   imageView = [[UIImageView alloc] init];
   ...
}

- (void)dealloc{
   [imageView release];
   [super dealloc];
}

controller2 为此 imageView 下载图像:

- (void)viewDidLoad{
 ...

[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:
    ^(NSURLResponse *response, NSData *data, NSError *error) {
        UIImage * image = [[UIImage alloc] initWithData:data scale:[[UIScreen mainScreen] scale]];
        imageView.image = image; 
        [image release];    
    }];
 }

显然,用户可以按导航栏顶部的“后退”按钮,我们的controller2对象将与此imageView一起释放。

情况:

  • 下载开始;

  • Controller 弹出(用户按下“后退”按钮)

  • 下载结束,imageView.image = image导致(?)EXC_BAD_ACCESS(因为imageView被释放)

那么,我应该怎么做才能让它在我的代码中变得很酷? 我喜欢积木!与 NSURLConnection 委托(delegate)相比,乐趣更多,代码/类更少。

  • block 可能保留实例变量吗? (:OOO)

  • 也许我应该在 block 之前保留实例变量并在 block 中释放它? (我认为这很愚蠢)

那么,使用此类 block 的最佳实践是什么? 也许我不应该在这种情况下使用 block 来使我的代码更好?

p.s.:我尝试这样做:将 NSOperationQueue 作为实例变量,并停止 dealloc 中的所有任务..但这会消除此 block 的优势:( 在这种情况下,最好将我的下载器类与委托(delegate)一起使用;(无论如何,代码太多。

附注: 我知道在弹出 Controller 后我应该停止下载;但我不关心这个。 让它成为任何任务(例如,转换视频等,任何“繁重”的后台线程),无论如何都应该完成,即使用户离开了这个 Controller ,但它会使用一些实例变量(如果它们还活着)。

谢谢

最佳答案

你应该声明你的变量:

    __block UIImageView*imageView;

关于iphone - 访问 block 内的实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12876234/

相关文章:

objective-c - 在 Objective-C 中,指定初始化器总是被调用的规则并不总是被遵守?

objective-c - 如何在 iOS 6 中将步行轨迹或路线显示为 map 叠加层

iOS 发布 Reference iPhoneContactList with ARC

ios - 恢复默认导航栏外观

用于回合制游戏的 iOS SpriteKit 物理学?

ios - 使用 Swift 在 TableView 中重新加载单元格数据

iphone - iOS 4背景HTTP Live Stream

iphone - 在 UITableView 中保留占位符单元格

ios - 未调用嵌套 UITextField 的 UITextFieldDelegate

java - 将 Java Web 服务 WSDL 与 gsoap C 客户端一起使用时出现标记不匹配错误