【发布时间】:2011-10-01 13:08:46
【问题描述】:
我正在尝试复制一个传递给这样的方法的字符串:
-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
NSLog( @"elementName, %@: %i", elementName, [elementName retainCount] ); // rc = 2
if ( currenttag )
[currenttag release];
NSLog( @"currenttag: %i", [currenttag retainCount] ); // rc = 0
//currenttag = [[NSString alloc] initWithString:elementName]; // track current element
[self setCurrenttag:elementName];
NSLog( @"currenttag: %i", [currenttag retainCount] ); // rc = 3
.
.
.
}
setCurrenttag 是合成访问器 (@property (copy))。我的理解是,这将创建一个全新的对象,而不仅仅是对elementName 的引用。上面的行为就好像它保留了对elementName 的引用并调用了retain。被注释掉的代码显示了相同的行为。
这些方法正在实现NSXMLParserDelegate 协议,但我确实需要跟踪某些元素名称(但不是全部)。
关于 iPhone 上的 NSString 对象和内存管理,我有什么遗漏吗?
另外,作为参考,我正在使用 XCode 3.6 的 iPhone 模拟器上运行它。
【问题讨论】:
-
如果你担心字符串没有被复制,为什么不检查 elementName 和 currenttag 的指针?
-
@Brad Larson 保留计数不是监视内存泄漏的快速方法吗?
-
@Mike - 不。在上面的链接中阅读 Dave 对此的看法。如需更强烈的回应,请参阅:stackoverflow.com/questions/3730804/…。请注意,这两个人都是 Apple 员工。
-
@Brad Larson 感谢您的澄清。
标签: iphone objective-c