创建新的NSString实例的保留计数为3

Mik*_*e D 2 iphone objective-c

我试图复制一个传递给如下方法的字符串:

-(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

    .
    .
    .
    }
Run Code Online (Sandbox Code Playgroud)

setCurrenttag是一个综合存取器(@property (copy)).我的理解是,这将创建一个全新的对象,而不仅仅是一个引用elementName.上面的行为好像它保持对引用elementName和调用retain.注释掉的代码显示了相同的行为.

这些方法正在实现NSXMLParserDelegate协议,但我确实需要跟踪某些元素名称(但不是全部).

NSString在iphone上有没有关于对象和内存管理的东西.

另外,作为参考,我在带有XCode 3.6的iPhone模拟器上运行它.

Tom*_*ton 5

对于像NSString这样的不可变基础类,copy只需保留该对象即可.复制已知为不可变的对象将浪费资源,因此不会发生.这在NSCopying协议的文档中有所暗示.实施该协议的其中一个选择是:

  • 通过保留原始而不是在类及其内容不可变时创建新副本来实现NSCopying

通常,如果您知道某个类的实例将是不可变的,那么保留目标对象而不是复制它是完全有效的.