Objective c 为什么Xcode 4.5静态分析器告诉我,当我尝试使用_属性_((NSObject))时,可能存在内存泄漏 我有一个拥有核心基础对象的属性,具体是CFHTTPMasgErEFF。我尝试使用属性((NSObject))宏告诉编译器将引用的对象视为普通的NSObject,并为我处理该对象的保留和释放,而不必自己释放。我尝试将属性改为弱而不是强,但似乎没有任何效果,静态分析器仍然告诉我内存泄漏,从CFGetRetainCount输出的外观来看,它是正确的。有人知道我的财产会导致内存泄漏的原因吗: typedef __attribute__((NSObject)) CFHTTPMessageRef HTTPMessageRef; @interface ABRemoteConnection : NSObject @property (strong) HTTPMessageRef message; @end - (void)dataReceived:(NSNotification *)notification { self.message = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, TRUE); // do some stuff and if the message is complete, use it and release the // message object if (messageIsComplete(self.message)) { self.message = NULL; } }
从中可以看出,Objective c 为什么Xcode 4.5静态分析器告诉我,当我尝试使用_属性_((NSObject))时,可能存在内存泄漏 我有一个拥有核心基础对象的属性,具体是CFHTTPMasgErEFF。我尝试使用属性((NSObject))宏告诉编译器将引用的对象视为普通的NSObject,并为我处理该对象的保留和释放,而不必自己释放。我尝试将属性改为弱而不是强,但似乎没有任何效果,静态分析器仍然告诉我内存泄漏,从CFGetRetainCount输出的外观来看,它是正确的。有人知道我的财产会导致内存泄漏的原因吗: typedef __attribute__((NSObject)) CFHTTPMessageRef HTTPMessageRef; @interface ABRemoteConnection : NSObject @property (strong) HTTPMessageRef message; @end - (void)dataReceived:(NSNotification *)notification { self.message = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, TRUE); // do some stuff and if the message is complete, use it and release the // message object if (messageIsComplete(self.message)) { self.message = NULL; } },objective-c,xcode4.5,core-foundation,Objective C,Xcode4.5,Core Foundation,从中可以看出,\uuuuu属性((NSObject))仅用于保留 但是将strong切换到retain意味着您现在正在添加道具将为您管理的另一个ref;仍然有原始的ref,您必须CFRelease 如果你仔细想想,这是有道理的。想象一下,对一个属性(retain)NSObject*执行同样的操作: - (void)dataReceived:(NSNotification *)notification { self.o = [[NSObject alloc] init]; } 这很好,但
\uuuuu属性((NSObject))
仅用于保留
但是将strong
切换到retain
意味着您现在正在添加道具将为您管理的另一个ref;仍然有原始的ref,您必须CFRelease
如果你仔细想想,这是有道理的。想象一下,对一个属性(retain)NSObject*
执行同样的操作:
- (void)dataReceived:(NSNotification *)notification {
self.o = [[NSObject alloc] init];
}
这很好,但只是因为ARC看到了alloc
,并自动在范围的末尾为您插入相应的版本。使用CF\uu\u Create
函数,作用域末尾没有自动的CFRelease,因此您必须手动编写一个
如果您真的希望HTTPMessageRef
像NSDictionary
一样方便,那么它不能只是一个typedef;它必须是一个免费的桥接类。从中,它看起来像是\uuuuu属性((NSObject))
仅用于保留
但是将strong
切换到retain
意味着您现在正在添加道具将为您管理的另一个ref;仍然有原始的ref,您必须CFRelease
如果你仔细想想,这是有道理的。想象一下,对一个属性(retain)NSObject*
执行同样的操作:
- (void)dataReceived:(NSNotification *)notification {
self.o = [[NSObject alloc] init];
}
这很好,但只是因为ARC看到了alloc
,并自动在范围的末尾为您插入相应的版本。使用CF\uu\u Create
函数,作用域末尾没有自动的CFRelease,因此您必须手动编写一个
如果您真的希望HTTPMessageRef
像NSDictionary
一样方便,那么它不能只是一个typedef;它必须是一个免费的桥接类。您还没有将ABRemoteConnection
定义为NSObject
的子类……这是否意味着ARC不能用@property
发挥其魔力?我实际上是在对NSObject进行子类化,这只是我的一个输入错误。我已经更新了示例以反映这一点。您没有将ABRemoteConnection
定义为NSObject
的子类……这是否意味着ARC无法使用@property
发挥其魔力?我实际上是在将NSObject子类化,这只是我的一个输入错误。我更新了示例以反映这一点。我的理解是,在使用ARC时,retain
和strong
基本上是同义词。两者都应该保留传递给它的对象。无论哪种方式,我都尝试了使用retain
,但在运行静态分析器时仍然会出现潜在的内存泄漏。此外,在您的解释中,您提到ARC可以看到alloc并插入相应的版本,但我认为这就是\u attribute\uuuuuuuu((NSObject))
宏的全部要点。这难道不只是一个让编译器知道它需要将传入的对象作为特例处理的标志吗?我相信问题在于CFHTTPMessageCreateEmpty
不返回\uu属性((NSObject))CFHTTPMessageRef
,它返回一个普通的CFHTTPMessageRef
,所以ARC不会为它插入释放。(还有一个小问题:\uuuu属性\uuuu
不是宏;它是由编译器而不是预处理器处理的。)我认为\uu属性((NSObject))
的要点是充当编译器的信号,而不是表示某种数据类型。我同意,我之前称它为宏时使用了错误的术语,这实际上不是预处理器宏,而是一个编译器标志(如果我理解正确的话),实际上只是告诉编译器将相应变量所持有的数据视为正常对象,并适当地管理内存。也许我错了。这是一个编译器标志还是其他什么?编译器标志是在命令行上传递给编译器的参数(或GUI IDE中的等效设置),如“include debug info”的-g
。#pragma
通常相当于一行一行地(而不是一个文件一个文件地)执行编译器标志,而uuu属性uuu
有时类似,但它实际上与语言级别的事物(函数、变量和类型)交互。至于正确的术语……我相信gcc将它们称为“某些事物”,而MSVC则称属性为“特殊属性”;我不确定哪一个更有用……我的理解是,在使用ARC时,retain
和strong
基本上是同义词。两者都应该保留传递给它的对象。无论哪种方式,我都尝试了使用retain
,但在运行静态分析器时仍然会出现潜在的内存泄漏。此外,在您的解释中,您提到ARC可以看到alloc并插入相应的版本,但我认为这就是\u attribute\uuuuuuuu((NSObject))
宏的全部要点。这不只是一个让编译器知道它需要将传入的对象视为特例的标志吗?我相信问题在于CFHTTPMessageCreateEmpty
不返回\uuu属性(NSObject))CFHTTPMessage