我得到了下面的测试代码。
(通过这个例子,我遇到了一个接口(interface)不能在没有保留的情况下静态分配。)
通过这个codeblock,我明白了什么是retain。
我想确定这是否会泄漏,我是否应该在其他地方释放它。
只是我不想每次都重新初始化数组。并使其成为静态的。(内存上的缺点但速度上的优势)
我应该在某处释放这个保留的静态数组吗?它是一个安全的代码还是我完全删除静态并保留单词并仅使用经典的 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_;
}
总结:
为什么 static 不保留数组初始值?和
如果我想使用保留,是否会发生内存泄漏?
最佳答案
这只是您可以声明一个全局的、不可变的对象数组的一种方式。
从没有分配是无法访问的内存的意义上说,这不是泄漏。进一步举这个例子(阅读:愚蠢),你的程序可以 -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];
}
这需要零堆分配、零静态存储和零锁;)
关于objective-c - 保留静态数组会导致非弧项目泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18758175/