保留静态数组会导致非弧项目泄漏吗?

时间:2013-09-12 07:33:52

标签: objective-c static nsarray memory-leaks

我在下面得到了一个测试代码 (通过这个例子,我遇到了一个接口,如果没有保留就不能静态分配。)

通过这个代码块我理解真正保留的是什么 我想确定是否会泄漏,我应该在其他地方发布它。 我根本不想每次重新初始化阵列。并使其静止。(记忆中的缺点但速度有利)

我应该在某处释放这个保留的静态数组吗?它是一个安全的代码还是我完全删除静态和保留单词,并且只是使用arrayObjects方法通常使用init? 那么你更喜欢我?

-(NSUInteger)getCoordYByX:(int)ax
{
    NSUInteger ret_=-1;

    static NSArray *coordsX=nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        coordsX=[[NSArray arrayWithObjects:
                      [NSNumber numberWithInt:50],
                      [NSNumber numberWithInt:170],
                      [NSNumber numberWithInt:190],
                      [NSNumber numberWithInt:210],
                      [NSNumber numberWithInt:350],
                      nil]retain];
                      /*it is more longer. cropped for test purposes*/

});
    ret_=[[coordsX objectAtIndex:ax] unsignedIntegerValue];
return  ret_;

}

<小时/> 总之:
为什么静态不保持数组初始值?和
如果我想使用retain,可能会发生内存泄漏?

2 个答案:

答案 0 :(得分:1)

static只是让你的变量保持活着,直到你的应用程序退出。静态声明不会泄漏。我认为这里有可能泄漏您的代码。因为,

[[NSArray arrayWithObjects:
                  [NSNumber numberWithInt:50],
                  [NSNumber numberWithInt:170],
                  [NSNumber numberWithInt:190],
                  [NSNumber numberWithInt:210],
                  [NSNumber numberWithInt:350],
                  nil]retain];

等于

[[[[NSArray alloc] initWithObjects:
 [NSNumber numberWithInt:50],
 [NSNumber numberWithInt:170],
 [NSNumber numberWithInt:190],
 [NSNumber numberWithInt:210],
 [NSNumber numberWithInt:350],
   nil] autorelease] retain];

所以你的保留信息会造成泄密。

答案 1 :(得分:1)

这只是一种可以声明全局不可变对象数组的方法。

在没有分配无法访问的内存的意义上,这不是泄漏。为了进一步采用这个例子(读取:愚蠢),你的程序可以-retain所有这些对象,你仍然可以通过定义无法访问的内存而没有泄漏。该数组只被初始化一次并且从未被重新分配,因此您的方法始终可以访问初始数组,并且它的元素总是可以通过数组访问。

但是,这是在程序终止之前无法回收的内存(假设输入了方法体)。所以,它真的不是我鼓励的设计(事实上,我避免这种设计)。

更好的选择看起来更像:

+ (NSUInteger)coordYByX:(int)ax
{
 enum { NCoordsX = 5 };
 const NSUInteger CoordsX[NCoordsX] = { 50,170,190,210,350 };
 assert(ax < NCoordsX && "invalid index"); // handle error as you handle errors
 return CoordsX[ax];
}

这需要零堆分配,零静态存储和零锁定;)