【问题标题】:Objective-C - Using blocks and memory management?Objective-C - 使用块和内存管理?
【发布时间】:2012-07-02 16:06:16
【问题描述】:

我正在阅读有关 Grand Central Dispatch 的文档,其中有两个函数称为 Block_copyBlock_release。 根据文档,这些方法在调用dispatch_async 来处理块的内存管理时被使用。我想在我的代码中做同样的事情吗?

我下面的代码有问题吗?

typedef void (^MyCompletionHandler)(NSError *error)

@interface ServiceClient

- (void)fetchWithCompletionHandler:(MyCompletionHandler)completionHandler;

@property (nonatomic, assign) MyCompletionHandler completionHandler;

@end

@implementation ServiceClient
@synthesize completionHandler = _completionHandler;

- (void)fetchWithCompletionHandler:(MyCompletionHandler)completionHandler 
{
   self.completionHandler = completionHandler;
   [self performSelectorInBackground:@selector(fetchInBackground)];
}

@end

【问题讨论】:

    标签: objective-c memory-management objective-c-blocks grand-central-dispatch


    【解决方案1】:

    您应该使用以下声明:

    @property (nonatomic, copy) MyCompletionHandler completionHandler;
    

    使用assign,您的块将不会被保留,但copy 将自动执行Block_copy

    【讨论】:

    • 使用 strong 代替 copy 有问题吗?当我可以保留对象时,为什么我想要一个副本?
    • 据我所知,Objective-C 运行时将 strong 视为与 copy 相同的块。而copy 与块的含义与copy 与对象不同。我建议阅读这篇关于主题的文章:informit.com/articles/article.aspx?p=1749597
    • @Stream strongcopy 的处理方式不同——后者将保证一个块在堆上或移动到堆然后也保留,而前者只会保证它被保留(因此可能仍然在堆栈上)。
    【解决方案2】:

    您应该在将块分配给变量时复制它们——在这种情况下,您可以将completionHandler 属性更改为具有(nonatomic, copy) 属性,或者在分配块时使用Block_copy,就像您说的那样。

    【讨论】:

    • 但据我了解,objective-C 级别的复制与 c 级别的复制功能不同。它们完全不同。那么将属性更改为复制是否可以正确完成这项工作?它会触发 Block_copy 被调用吗?
    • @aryaxt: Block_copy(someBlock)[someBlock copy] 相同;并且Block_release(someBlock)[someBlock release] 相同。前者用于 C/C++ 并且您没有 Objective-C。后者遵循 Objective-C 中的常规语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    相关资源
    最近更新 更多