5

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

通过这个代码块,我明白了真正的保留是什么。
我想确定这是否会泄漏,我是否应该将其释放到其他地方。只是我不想每次都重新初始化数组。并使其成为静态的。(内存的劣势,但速度的优势)

我应该在某处释放这个保留的静态数组吗?它是一个安全的代码还是我完全删除了静态并保留了单词并且只是经典地使用 arrayObjects 方法初始化?那么你更喜欢我什么?

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

}


总之:
为什么静态不保留数组初始值?
如果我想使用保留,可能会发生内存泄漏吗?

4

2 回答 2

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];

因此,您的保留消息会造成泄漏。

于 2013-09-12T09:15:22.930 回答
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];
}

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

于 2013-09-12T11:22:22.857 回答