gpt4 book ai didi

iphone - 创建一个新的 NSString 实例,其保留计数为 3

转载 作者:行者123 更新时间:2023-12-03 20:23:15 24 4
gpt4 key购买 nike

我正在尝试复制传递到方法中的字符串,如下所示:

-(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 协议(protocol),但我确实需要跟踪某些元素名称(但不是全部)。

关于 iphone 上的 NSString 对象和内存管理,我是否缺少一些东西。

此外,作为引用,我正在使用 XCode 3.6 在 iPhone 模拟器上运行它。

最佳答案

对于像 NSString 这样的不可 rebase 础类,copy 只是保留对象。复制已知不可变的对象会浪费资源,因此不会发生这种情况。 NSCopying 协议(protocol)的文档中暗示了这一点。实现该协议(protocol)的选项之一是:

  • Implement NSCopying by retaining the original instead of creating a new copy when the class and its contents are immutable

一般来说,如果您知道某个类的实例是不可变的,那么保留目标对象而不是复制它是完全有效的。

关于iphone - 创建一个新的 NSString 实例,其保留计数为 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6629435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com