好吧,我想知道为什么在这种情况下会出现内存循环:
@property (nonatomic, strong) NSArray *myBlocks;
// and the method
[self.myBlocks addObject: ^(){
[self doSomething];
}];
好吧,该块有一个指向 self 的强指针,因为在其中引用了 self 。我们强烈指向 myBlocks。但是为什么 myBlocks 有一个指向块的强指针呢?
好吧,我想知道为什么在这种情况下会出现内存循环:
@property (nonatomic, strong) NSArray *myBlocks;
// and the method
[self.myBlocks addObject: ^(){
[self doSomething];
}];
好吧,该块有一个指向 self 的强指针,因为在其中引用了 self 。我们强烈指向 myBlocks。但是为什么 myBlocks 有一个指向块的强指针呢?
但是为什么 myBlocks 有一个指向块的强指针呢?
NSArray 持有对其元素的强引用。
通常,您通过向 NSArray 或 NSMutableArray 类发送一个数组...消息来实例化一个数组。数组...消息返回一个数组,其中包含您作为参数传入的元素。并且当您将对象添加到 NSMutableArray 对象时,不会复制该对象(除非您将 YES 作为参数传递给 initWithArray:copyItems:)。相反,对对象的强引用被添加到数组中。
更多在这里
您的 self 类对 myBolcks 有很强的引用:
@property (nonatomic, strong) NSArray *myBlocks;
这是取自苹果文档:
Blocks maintain strong references to any captured objects, including self...
在您的场景中,self 具有通过捕获 self 来阻塞和阻塞的强指针,也具有强指针 do self ,它是保留周期,这会造成内存泄漏。
要打破这个循环,在将它传递给块之前使用指向 self 的弱指针。