Ios methodSignatureForSelector上的内存泄漏

Ios methodSignatureForSelector上的内存泄漏,ios,objective-c,memory-leaks,automatic-ref-counting,Ios,Objective C,Memory Leaks,Automatic Ref Counting,我有下面的代码,当我使用instruments分配工具分析生成时,它给了我一个漏洞 SEL sel = NSSelectorFromString(self.selector); NSInvocation* invocation = [ NSInvocation invocationWithMethodSignature:[ self.target methodSignatureForSelector:sel ] ]; [ invocation setTarget:self.target ];

我有下面的代码,当我使用instruments分配工具分析生成时,它给了我一个漏洞

SEL sel = NSSelectorFromString(self.selector);

NSInvocation* invocation = [ NSInvocation invocationWithMethodSignature:[ self.target methodSignatureForSelector:sel ] ];

[ invocation setTarget:self.target ];
[ invocation setSelector:sel ];

[ invocation invoke ];
代码不检查返回值。有一些调用将返回对象,但这些调用只是被忽略

泄漏指向[NSMethodSignature methodSignatureForSelector]的调用。堆栈显示此函数中的calloc调用泄漏了48个字节

因为,我使用的是ARC,我的假设是这些缓冲区将被自动垃圾收集。但还是有漏洞。分配工具中最靠近堆栈顶部的最后一个符号函数是

+[ NSMethodSignature signatureWithObjCTypes ]
在代码执行过程中,这些代码会被调用数千次,而漏洞会堆积起来。如果您能帮我查到这一点,我们将不胜感激

我的过程:
我使用工具-分配,检查ref计数,然后运行两代。分配工具允许您深入到一个生成中,然后选择一个在生成过程中分配(但未释放)的缓冲区,然后可以深入到缓冲区中查看其引用计数历史。如果最后一个条目具有ref计数,则可能存在泄漏。现在只需推断是否存在导致该对象泄漏的强循环

编译器会抱怨内存泄漏,但如果选择器返回void,则此处不会泄漏内存。看看这个

尝试使用以下方法:

[self.target performSelector:sel object:nil afterDelay:0.0];

正如@Basheer_CAD引用的线程中所建议的,我将所有返回对象的nsinvocation更改为现在返回void。但这对泄漏没有影响。此外,分配工具似乎明确指出methodForSignature是罪魁祸首,而不是调用的返回值。然后,我决定再运行几代,现在很明显,泄漏的数量减少了。在第三代,没有更多的泄漏。所以,这个泄漏似乎和是否有NSInvocation的返回对象无关。methodSignatureForSelector似乎正在分配一个48字节的缓冲区,该缓冲区针对类对象进行缓存。缓存可能为同一方法签名的重复调用提供服务。我将不考虑这个漏洞,因为它在几代之后不会出现,并且将根据某种缓存构建来计算它。
因此,如果这些泄漏出现,解决它的最佳方法是再运行几代,直到它不再出现。

您真的需要使用
NSInvocation
?你的代码还有更多吗?如图所示,您不传递任何参数或使用返回值,因此没有理由使用
NSInvocation
。我删除这些参数只是为了简洁,因为我认为它们与泄漏无关。从文件中提取并使用setArguments传递不同的参数。但是编译器没有为我标记任何警告。我认为这可能与未被释放的返回对象有关,但是为什么它会将methodSignatureForSelector调用标记为具有不符合要求的calloc呢。它明确指向此调用本身的内部。是否尝试了performSelector?我没有使用performSelector,因为我需要根据选择器灵活地添加变量参数,这是由NSInvocation setArgument提供的。performSelector会提供更好的警告吗?好吧,performSelector让您有机会传递多达2个参数,但它更容易,也不容易出错。你是怎么发现泄漏的?到底是什么东西泄漏的?我说我要试着去除回流,看看泄漏是否消失。我需要一些时间才能得到结果,但我会与大家分享。虽然我不知道为什么分配工具会将错误的calloc标记为违规者,除非NSInvocation出于某种原因将分配工具弄糊涂。感谢您发布您的发现