objective-c - 为什么 NSSet objectEnumerator 会增加保留计数?

标签 objective-c cocoa

在以下代码中获取 objectEnumerator 后,set1 保留计数变为 3。我很惊讶地看到这一点,因为我没想到它会改变。我搜索了documentation并且找不到解释这种效应的地方。

我假设额外的保留可能被 Cocoa 枚举逻辑设置为自动释放,并且在当前事件循环中不会真正产生任何影响。 objectEnumerator 逻辑需要引用 set1 是有道理的,但我想知道为什么要创建它们。原因是:如果我假设 set1 在代码中释放后保留计数为零,那么我可以尝试重用它另一个新集。由于 set1 现在指向一个完全不同的对象/地址,这不会导致问题吗?

对于“奖励”点,是否有一种方法可以枚举自动释放池以查看它实际包含的内容? TIA

#import <Foundation/NSObject.h>
#import <Foundation/NSSet.h>
#import <Foundation/NSValue.h>
#import <Foundation/NSEnumerator.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSString.h>

#import <stdio.h>;

// macro to create an integer number:
#define INTOBJ(v) [NSNumber numberWithInt: v]

int main (int argc, char *argv[])
{
    NSAutoreleasePool *pool = [NSAutoreleasePool new];

    //Make set
    NSMutableSet *set1 = [[NSMutableSet alloc] initWithObjects:
        INTOBJ(1), INTOBJ(2), INTOBJ(5), INTOBJ(10), nil];

    printf("set1 #%lu\n", [set1 retainCount]);

    //Get enumerator of the set. This is where the retain count goes to 3:
    NSEnumerator *setEnum = [set1 objectEnumerator];
    printf("setEnum #%lu\n", [setEnum retainCount]);
    printf("set1 #%lu\n", [set1 retainCount]);

    //Iterate through the collection:
    printf("[");

    NSNumber *element;
    while ((element = [setEnum nextObject]) != nil)
        //do some this with item. printf is just for debugging:
        printf(" %i ", [element intValue]);

    printf("]\n");
    printf("set1 #%lu\n", [set1 retainCount]);

    [set1 release];
    printf("set1 after release #%lu\n", [set1 retainCount]);

    //More logic could go here reusing variable set1 since I assumed retain count = 0

    [pool release];

    return 0;
}

最佳答案

依赖对象的保留计数通常不是一个好主意,因为它是框架的内部细节。相反,请确保您的代码遵守内存管理原则,特别是确保保留/新建/复制和释放/自动释放保持平衡。

关于objective-c - 为什么 NSSet objectEnumerator 会增加保留计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/331490/

相关文章:

ios - 导航栏标题字体颜色未使用 RGB 设置,但可以使用标准颜色

swift - Swift中的角色游戏效果/药水生成器

swift - String.substringWithRange 是否有界?

objective-c - 您可以从枚举元素的数值访问实际标识符吗?

ios - Cocoa Swift,在文件和目录上获取/设置隐藏(可见/不可见)标志

swift - 如何在 Swift 3 Cocoa 应用程序中检测命令 + 箭头键

ios - 将快速闭包传递给以 block 作为参数的 Objective-C 函数

objective-c - cellForRowAtIndexPath 未被调用

ios - BlackRaccoon 下载文件时出现错误 : unrecognized selector sent to instance 0xcd609f0

ios - 无法发出 POST 请求 - AFNetworking