-2

好吧,我想知道为什么在这种情况下会出现内存循环:

@property (nonatomic, strong) NSArray *myBlocks;

// and the method

[self.myBlocks addObject: ^(){
    [self doSomething];
}]; 

好吧,该块有一个指向 self 的强指针,因为在其中引用了 self 。我们强烈指向 myBlocks。但是为什么 myBlocks 有一个指向块的强指针呢?

4

2 回答 2

0

但是为什么 myBlocks 有一个指向块的强指针呢?

NSArray 持有对其元素的强引用。

通常,您通过向 NSArray 或 NSMutableArray 类发送一个数组...消息来实例化一个数组。数组...消息返回一个数组,其中包含您作为参数传入的元素。并且当您将对象添加到 NSMutableArray 对象时,不会复制该对象(除非您将 YES 作为参数传递给 initWithArray:copyItems:)。相反,对对象的强引用被添加到数组中。

更多在这里

于 2014-08-13T11:28:12.767 回答
0

您的 self 类对 myBolcks 有很强的引用:

@property (nonatomic, strong) NSArray *myBlocks;

这是取自苹果文档:

Blocks maintain strong references to any captured objects, including self...

在您的场景中,self 具有通过捕获 self 来阻塞和阻塞的强指针,也具有强指针 do self ,它是保留周期,这会造成内存泄漏。

要打破这个循环,在将它传递给块之前使用指向 self 的弱指针。

于 2014-08-13T11:30:24.740 回答