- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
为方便起见,我用一些工作代码编辑了上一篇文章。
以下代码 (ARC'ed) 似乎会泄漏,并会在短时间运行后使 sim 卡或设备崩溃:
#define kROWS 100
#define kCols 34
void run();
static ViewController *instance;
@interface ViewController ()
@property (nonatomic, strong) NSMutableArray *nsBackColor;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.nsBackColor = [NSMutableArray arrayWithCapacity:1];
instance = self;
// set up a '2D array'
for (int x = 0; x < kROWS; x++) {
[self.nsBackColor addObject:[NSMutableArray arrayWithCapacity:1]];
for (int y = 0; y < kCols; y++) {
[[self.nsBackColor objectAtIndex:x] addObject:[UIColor whiteColor]];
}
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
run();
});
}
- (void)plotColor:(UIColor *)color atX:(short)x andY:(short)y {
[[self.nsBackColor objectAtIndex:x] replaceObjectAtIndex:y withObject:color];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
void plot(short xLoc, short yLoc,
short backRed, short backGreen, short backBlue) {
@autoreleasepool {
[instance plotColor:[UIColor colorWithRed:((float)backRed/100)
green:((float)backGreen/100)
blue:((float)backBlue/100)
alpha:(float)1]
atX:xLoc andY:yLoc];
}
}
void run() {
short x = 0;
short y = 0;
short backRed = 0;
short backGreen = 0;
short backBlue = 0;
while (true) {
x++;
if (x >= kROWS) {
x = 0;
}
y++;
if (y >= kCols) {
y = 0;
}
backRed = arc4random() % 255;
backBlue = arc4random() % 255;
backGreen = arc4random() % 255;
plot(x, y, backRed, backGreen, backBlue);
usleep(1000);
}
}
如果我让它在设备或模拟器上运行足够长的时间(几分钟),我将收到 mmap malloc 错误 (sim) 或内存警告(设备)并崩溃。
通过 Instruments Allocations,我可以看到 +[UIColor colorWithRed:green:blue:alpha:] 开始膨胀,直到最终撞到内存墙。
我可以将 UIColor 分配给一个属性(直接或通过复制),比如 self.myColor = color,并且没有这样的泄漏。
我也可以这样做:
[[self.nsBackColor objectAtIndex:x] replaceObjectAtIndex:y withObject:[self description]];
我也遇到了同样的问题。
在我看来,数组中替换的对象(是的,这最初是作为一个 2D c 数组开始的,但我认为这是问题所在)永远丢失和泄漏并且没有正确释放。
这将是 Instruments-> 短时间运行后的分配:
如有任何帮助,我们将不胜感激,并可提供更多信息。
最佳答案
发生的事情是您在每次迭代时都创建了一个自动释放池。因此,每次使用新的自动释放池运行以下行:
[[self.nsBackColor objectAtIndex:x] replaceObjectAtIndex:y withObject:color];
因此 color
将其在本地池中的引用计数增加一个,而 [[self.nsBackColor objectAtIndex:x] objectAtIndex:y]
将其在本地池中的引用计数减少一个本地池。但这里有一个问题:该项目在上一次迭代中是 color
,它的引用计数由您之前清空/释放的上一个池管理。
所以应该发生的事情是,当先前的池在先前的迭代中被释放时,该对象也被释放了。它的引用计数是 2(一个用于 [UIColor colorWith...]
,一个用于添加到数组),所以它应该在池被排空后立即收到 2 条释放消息,并且指针在 [[self.nsBackColor objectAtIndex:x] objectAtIndex:y]
中应该悬空,直到您在当前迭代中用指向 color
的指针替换它。
显然,这并没有完全按照预期的方式发生,也没有按照我的理解发生。但是,@autoreleasepool {}
指令显然放错了地方。它应该围绕 while (true)
循环,或者完全删除以支持线程池。
关于ios - NSMutableArray replaceObjectAtIndex :withObject Loop Leakage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15079177/
在 viewDidLoad 上,我的应用程序填充 NSMutableArray arrayOfHaiku,它是 NSDictionary 项的数组,如下所示: NSError *error; NS
我在 NSMutableArray 上是这样的: NSMutableArray *array = [NSMutableArray arrayWithObjects:@"0",@"0",@"0",@"0
我正在尝试设置我的 allArticlesArray 的内容,然后将附加对象附加到数组中。这是我的代码片段: [self.allArticlesArray setArray:newsArray]; [
我用 NSMutableArray 中的数据填充了 TableView ,一切正常。当我选择一个单元格(didSelectRowAtIndex)时,该项目将从数组中删除,正如它应该做的那样。现在我希望
我有一个 NSMutableArray 是我的代表,我也在我的一个 View Controller 中使用它。 所以在 viewDidLoad 我像这样制作我的 NSMutableArray 的可变副
我有 100 个元素的 NSMutableArray。 我想将“20 - 50”、“10 - 20”、“60 - 100”和 50 - 60. 元素加载到单独的 NSMutableArray 中,并将
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我在尝试将字符串的 NSMutableArray 共享给另一个类时遇到了一些问题。我有一个 tableView,其中填充了 Strings,我想将其添加到 NSMutableArray。然后在另一个
正如我们所知,数组是一个连续的内存分配。那么 NSMutableArray 大小将如何增加。 最佳答案 C 数组确实使用连续内存,C++ std::vector 也是如此,但是 NSMutableAr
我需要对一个数组进行排序,里面有一个数组,像这样: NSMutableArray * array_example = [[NSMutableArray alloc] init]; [array_e
这看起来很简单,但我只是得到一个空数组。 我想获取一个按下的按钮,找到它旁边的所有按钮(参见代码中的注释),并将所有找到的按钮添加到另一个 NSMutableArray。 然后我想遍历该数组并对每个按
我正在尝试在另一个 NSMutableArray 中添加 NSMutableArray。但我想做的是嵌套数组。 我当前的代码是: NSMutableArray *array1 = [NSMutab
我有三个类,即DepartmentViewController、DepartmentRequest、Department。这就像我从 DepartmentViewcontroller 发出部门请求,并
我正在尝试将 NSMutableArray 存储在 NSMutableArray 中。所以 var all:NSMutableArray = NSMutableArray() let localArr
这一定是那些错误之一,您一直盯着代码看很长时间,以至于找不到错误。 我有这个代码块,我在其中循环遍历一个包含多个 NSMutableArray 的 NSMutableArray: // FoodVi
我有一个包含 50 个条目的 NSMutableArray - 有什么简单的方法可以将其分成 5 个 NSMutableArray,每个 10 个条目。 最佳答案 是的,要划分 NSMutableAr
我想将 NSMutableArray 的 addObject 放入 NSMutableArray 中,那么我如何快速实现这一点。并检索它,所以请帮助我,因为现在我正在快速学习。 间接说我要二维数组是指
好吧: 我有 NSMutableArray 1 我还有 NSMutableArray 2 我想从数组 1 中删除与数组 2 中的对象匹配的所有对象。 有什么想法吗? 最佳答案 我刚刚打开文档,打印 N
我正在尝试制作 NSMutableArray 的深拷贝,其对象是与此类似的自定义类的实例: @interface CustomParent : NSObject @property NSInteger
我知道你们可能会觉得这是一个重复的问题。但我对我的项目的这个问题搞砸了。 现在转到这个问题,我已经采取了NSMutableArray命名为 arr1包含字符串值,例如 @"34" , @"40"等等。
我是一名优秀的程序员,十分优秀!