对象是否必须将N​​SObject扩展为块内的强引用?

时间:2012-11-30 12:21:55

标签: objective-c objective-c-blocks

来自Apple的Blocks Programming Topics: Blocks and Variables

  

Objective-C对象
  复制块时,它会创建对块中使用的对象变量的强引用。

如果对象没有从NSObject扩展怎么办?这有关系吗?

e.g。鉴于

的属性
@property(nonatomic, copy) FooBlock fooBlock;

是以下

-(void)foo:(NSObject<Foo>*)foo
{
    self.fooBlock = ^(){
        [foo bar];
    };
}

不同
-(void)foo:(id<Foo>)foo
{
    self.fooBlock = ^(){
        [foo bar];
    };
}

1 个答案:

答案 0 :(得分:2)

请注意,文档说明对象变量,而不是 NSOjbect 变量。无论基类如何,所有Objective-C对象在此上下文中都被视为相同。

正如其他人所指出的那样,您只需要确保您的对象响应通常的内存管理选择器 - 特别是保留和释放。

切向地,请记住,从NSObject之外的基类派生通常是不明智的。这是可能的(例如NSProxy),但它可以非常快速地变得非常复杂。确保你有充分的理由这样做。