代码之家  ›  专栏  ›  技术社区  ›  wh1t3cat1k

块内存管理

  •  3
  • wh1t3cat1k  · 技术社区  · 14 年前

    在本Apple参考中,对Objective-C中的Blocks对象有一个概念性概述:

    http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Blocks/Blocks.pdf

    然而,它并没有真正解释两个与我有关,可能与其他人有关的话题。第一个问题是:我可以为块引用指定一个零吗?还是应该使用空值?或者我可以不使用它们吗?

    第二个问题在于内存管理领域。比如,我已经声明了一个在堆栈上创建块对象的方法。

    -(void)makeTheClass
    {
        TheClass *object = [[TheClass alloc] init];
    
        object.blockReference = ^(void) { return nil; } 
    }
    

    在某些范围内创建的这个对象 摧毁 在它消失之后。但是class对象实际上将存储对这个(几乎被破坏的)块的引用:

    typedef id (^WeirdBlockType)(void);
    
    @interface TheClass {
        WeirdBlockType blockReference;   
    }
    

    如何为此类块声明类属性? 这两者有什么区别:

    @property (nonatomic, retain) WeirdBlockType blockReference;
    @property (nonatomic, copy)   WeirdBlockType blockReference; 
    

    ?

    苹果文档中明确指出,数据块复制会移动数据块。 堆起来 . 但如果我保留它呢?它出了以后会被摧毁吗 makeTheClass 方法范围?

    2 回复  |  直到 13 年前
        1
  •  2
  •   wh1t3cat1k    14 年前

    我找到了解决办法。 多亏了戈扬的回答,但事实上他在一个地方错了:

    维瓦是对的。 保留在块上无效 直到它完全移到堆中,并且 Block_copy 完成这样的任务。

    也许块不是唯一在堆栈上时不能保留的对象,而是在创建( alloc init 任何 NSObject 堆上的子类实例 默认情况下 你不在乎- retain 照常工作。创建块对象 默认在堆栈上 这就是为什么工作有点出乎意料。

    谢谢大家!

        2
  •  0
  •   Bruno Berisso    14 年前

    我能给一个街区打个零吗 参考文献?还是应该使用空值?

    nil可以理解为“空的 id 类型”和空的定义如下 ((void *)0) . 这里的区别在于上下文。如果使用的是基于nsObject的对象,则应使用nil。

    对于块,您应该使用nil,因为您可以像处理nsObject一样与块进行交互(您可以保留它、释放它等)。但如果您使用空值,它应该可以工作。

    如何声明类属性 这样一个街区?有什么区别吗 两者之间:

    @property (nonatomic, retain) WeirdBlockType blockReference;
    @property (nonatomic, copy)   WeirdBlockType blockReference; 
    

    ?

    文件中说:

    如果您使用的是Objective-C,则可以 发送块拷贝、保留和释放 (和自动释放)消息。

    所以这两个声明都是有效的,但是如果你问我,我更喜欢 retain copy .

    总之:

    块被视为同时定义和实例化的对象(运行时),因此在获得持久引用之后,您可以将该引用视为与任何其他对象一样。