Objective c 对象必须扩展NSObject才能成为块内的强引用吗?

Objective c 对象必须扩展NSObject才能成为块内的强引用吗?,objective-c,objective-c-blocks,Objective C,Objective C Blocks,来自苹果的 目标-C对象 复制块时,将创建对块内使用的对象变量的强引用 如果对象不从NSObject扩展怎么办?这有关系吗 e、 g.给定的属性 @property(nonatomic, copy) FooBlock fooBlock; 以下是 -(void)foo:(NSObject<Foo>*)foo { self.fooBlock = ^(){ [foo bar]; }; } -(void)foo:(NSObject*)foo { self.

来自苹果的

目标-C对象
复制块时,将创建对块内使用的对象变量的强引用

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

e、 g.给定的属性

@property(nonatomic, copy) FooBlock fooBlock;
以下是

-(void)foo:(NSObject<Foo>*)foo
{
    self.fooBlock = ^(){
        [foo bar];
    };
}
-(void)foo:(NSObject*)foo
{
self.fooBlock=^(){
[富吧];
};
}
有什么不同吗

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

注意,文档中提到的是对象变量,而不是NSOjbect变量。在此上下文中,所有Objective-C对象都被视为相同的对象,而不管它们的基类如何

正如其他人所指出的,您只需要确保对象响应通常的内存管理选择器,特别是retain和release


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

什么对象不扩展
NSObject
?您选择不保留其类的任何对象?-将被发送到block捕获的所有对象变量-如果您创建了自定义类,您应该会出现无法识别的选择器错误,甚至出现一些错误我认为这更符合理论而非实际的情况,假设您似乎没有使用不属于
NSObject
子类的类。因此,它可能属于更多的对象。NSProxy实现NSObject协议,即使它不是从NSObject继承的。……通过对象变量,假设您指的是objc_对象类型,唯一的要求是拥有一个类isa。那么,这与创建强引用有什么关系呢?我不知道你在问什么。你不清楚什么是强推荐吗?它只是意味着块在创建块时向对象发送-retain,在销毁块时向对象发送-release。