Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么NSSet objectEnumerator会增加保留计数?_Objective C_Cocoa - Fatal编程技术网

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

Objective c 为什么NSSet objectEnumerator会增加保留计数?,objective-c,cocoa,Objective C,Cocoa,在以下代码中获取objectEnumerator后,set1 retain计数变为3。我很惊讶地看到这一点,因为我没想到它会改变。我搜索了,找不到这个效果的解释 我假设额外的保留可能由Cocoa枚举逻辑设置为autorelease,并且在当前事件循环中不会产生任何影响。objectEnumerator逻辑需要对set1的引用,这是有道理的,但我想知道为什么要这样做。原因如下:如果我假设set1在代码中发布后保留了count zero,那么我可以尝试将其重用到另一个新的集合。既然set1现在指向一

在以下代码中获取objectEnumerator后,set1 retain计数变为3。我很惊讶地看到这一点,因为我没想到它会改变。我搜索了,找不到这个效果的解释

我假设额外的保留可能由Cocoa枚举逻辑设置为autorelease,并且在当前事件循环中不会产生任何影响。objectEnumerator逻辑需要对set1的引用,这是有道理的,但我想知道为什么要这样做。原因如下:如果我假设set1在代码中发布后保留了count zero,那么我可以尝试将其重用到另一个新的集合。既然set1现在指向一个完全不同的对象/地址,这难道不会引起问题吗

对于“额外”积分,是否有方法枚举自动释放池,查看它实际包含的内容?短暂性脑缺血发作

#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;
}
#导入
#进口
#进口
#进口
#进口
#进口
#进口;
//创建整数的宏:
#定义为BJ(v)[NSNumber-numberWithInt:v]
int main(int argc,char*argv[])
{
NSAutoreleasePool*池=[NSAutoreleasePool新建];
//定做
NSMutableSet*set1=[[NSMutableSet alloc]initWithObjects:
INTOBJ(1)、INTOBJ(2)、INTOBJ(5)、INTOBJ(10)、nil];
printf(“set1#%lu\n”,[set1重新计数];
//获取集合的枚举数。这是保留计数变为3的位置:
NSEnumerator*setEnum=[set1 objectEnumerator];
printf(“setEnum#%lu\n”,[setEnum retainCount]);
printf(“set1#%lu\n”,[set1重新计数];
//遍历集合:
printf(“[”);
NSNumber*元素;
while((元素=[setEnum nextObject])!=nil)
//对项目执行此操作。printf仅用于调试:
printf(“%i”,[element intValue]);
printf(“]\n”);
printf(“set1#%lu\n”,[set1重新计数];
[set1释放];
printf(“发布后的set1#%lu\n”,[set1重新计数];
//由于我假设retain count=0,所以在这里可以使用变量set1来实现更多的逻辑
[池释放];
返回0;
}

在发布后重用set1不会导致问题,因为保留计数在变量set1引用的对象上,而不是在变量本身上。

在发布后重用set1不会导致问题,因为保留计数在变量set1引用的对象上,不依赖于变量本身。

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

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

可能是枚举器保留了集合,以便在枚举过程中不会取消分配。没有要枚举的有效集合的枚举器将无法正常工作。事实上,枚举器确保其工作的唯一方法是保留其枚举的集合


也就是说,除了调试内存泄漏/双重释放问题外,没有任何理由查看任何对象的保留计数。只要遵循内存管理约定,就不必担心对象的保留计数。

可能枚举器正在保留集合,以便在枚举过程中不会释放该集合。没有要枚举的有效集合的枚举器将无法正常工作。事实上,枚举器确保其工作的唯一方法是保留其枚举的集合


也就是说,除了调试内存泄漏/双重释放问题外,没有任何理由查看任何对象的保留计数。只要遵循内存管理约定,就不必担心对象的保留计数。

我是进入Obj-C的未经清洗的.NET开发人员之一,因此我错过了托管GC。多亏了像你这样的人,我才掌握了处理保留计数的诀窍。在.NET中,变量在超出范围时被“释放”,并且不被引用。你对这篇文章怎么看:我能理解你为什么定义这些宏,但在代码审查中它们会把我弄糊涂;-)我是进入Obj-C的未经清洗的.NET开发人员之一,所以我错过了托管GC。多亏了像你这样的人,我才掌握了处理保留计数的诀窍。在.NET中,变量在超出范围时被“释放”,并且不被引用。你对这篇文章怎么看:我能理解你为什么定义这些宏,但在代码审查中它们会把我弄糊涂;-)