我在下面得到了一个测试代码 (通过这个例子,我遇到了一个接口,如果没有保留就不能静态分配。)
通过这个代码块我理解真正保留的是什么 我想确定是否会泄漏,我应该在其他地方发布它。 我根本不想每次重新初始化阵列。并使其静止。(记忆中的缺点但速度有利)
我应该在某处释放这个保留的静态数组吗?它是一个安全的代码还是我完全删除静态和保留单词,并且只是使用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_;
}
<小时/> 总之:
答案 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];
}
这需要零堆分配,零静态存储和零锁定;)