Kur*_*kay 5 static memory-leaks objective-c nsarray
我在下面得到了一个测试代码.
(通过这个例子,我遇到了一个接口,如果没有保留就不能静态分配.)
通过这个代码块,我理解了真正保留的是什么.
我想确定是否会泄漏,我应该在其他地方发布它.我根本不想每次重新初始化阵列.并使其静止.(内存不利但速度有利)
我应该在某处释放这个保留的静态数组吗?它是一个安全的代码还是我完全删除静态和保留单词,并且只是使用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_;
Run Code Online (Sandbox Code Playgroud)
}
这只是声明全局、不可变对象数组的一种方法。
从没有分配就是无法访问的内存的意义上来说,这不是泄漏。进一步举这个例子(读:愚蠢),你的程序可以使用-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];
}
Run Code Online (Sandbox Code Playgroud)
这需要零堆分配、零静态存储和零锁;)