【问题标题】:Memory leak on Allocations分配内存泄漏
【发布时间】:2016-09-12 22:54:00
【问题描述】:

我是一名初学者,但仍在试图弄清楚如何阅读此内容。 有 3 个自定义视图,一开始我分配第一个。 然后第二个/释放第一个,然后第三个/释放第二个。

我在释放每个视图之前清空/清空所有数组,所以从我所看到的,每次分配视图时保留的所有内存都应该在我释放/清空它们时释放,但在图中它不断增加,我不'根本看不到任何东西被释放。

应该是这样的吗?我将代表、数组、字典等一切都归零。

-(void)firstTOsecond {

[self.first removeFromSuperview];
self.first.delegate = nil;
self.first = nil;


self.second = [[Second alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.view addSubview:self.second];
self.second.delegate = self;}

-(void)secondTOthird {

[self.second removeFromSuperview];
self.second.delegate = nil;
self.second = nil;


self.third = [[Third alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.view addSubview:self.third];
self.third.delegate = self;}

编辑

在 First.m / Second.m / Third.m 中

-(instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
    self.buttonStartFrame = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"buttonStartFrame"]];
    [self addSubview:self.buttonStartFrame];
    self.buttonStartFrame.userInteractionEnabled = YES;
    self.buttonStartButton = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"buttonStartDefault"]];
    [self.buttonStartFrame addSubview:self.buttonStartButton];
    self.buttonStartButton.userInteractionEnabled = YES;
    self.labelStart = [[UILabel alloc]init];
    [self.buttonStartButton addSubview:self.labelStart];
    self.labelStart.textColor = [UIColor darkGrayColor];
    self.labelStart.text = @"Start";
    }
return self;}

【问题讨论】:

  • 你是重用元素还是创建新实例?
  • 编辑了我的问题。通过重用和创建新实例,您的意思类似于 VC 中的内容吗?这就是我正在做的事情。
  • 是的,将视图设置为 nil 不会释放它们.. 阅读 ARC 如何处理内存管理.. 创建一个类或方法来创建和更新视图也是一种好习惯,而不是创建一个新的 .. 分配委托等 .. [view removeFromSuperview] 然后添加相同的视图(即用于所有密集目的)不是要走的路.. 重用您的视图!
  • 代码序列self.first = nil; self.first.delegate = nil; 不会像我认为的那样做。在第一次分配之后,您没有引用任何对象self.first,因此第二次分配不会设置该对象的delegate。这不会出错,因为点表示法会转换为方法调用,您可以向nil 发送消息而不会出错 - 它什么也不做。检查您在其他地方没有犯同样的错误(它在您的问题中出现两次)。 HTH
  • 在将实际对象设置为 nil 之前,您必须将任何委托引用设置为 nil,您泄漏内存的原因是由于代码中的引用计数周期。 ARC 不会为您“解决”任何问题。更好的设计是不将 refs 从一个视图控制器保存到另一个视图控制器。

标签: ios objective-c swift memory-management instruments


【解决方案1】:

内存泄漏可能是您在更新视图元素时不断创建新视图元素。您可以创建辅助方法来避免分配新视图,并改为在主线程上更新视图元素

- (void)limitedUpdateTextColorView:(NSDictionary *)somethingCache {
    self.labelStart.textColor = [somethingCache valueForKey:@"bar"];
    self.labelStart.text = [somethingCache valueForKey:@"foo"];
}

【讨论】:

  • 我考虑了您的建议,但后来有代表。每个自定义视图都有自己的委托方法来分配/调用,因此我不能为所有 3 个共享一个属性,因为当屏幕上同时存在 2 个视图时,在转换之间调用了一些委托方法。我知道你在说什么,但它对我不起作用。
  • 有代表是什么意思?没有更多细节,我只能告诉你的是,这不应该影响有代表的事实..我建议你阅读编程模式,在这种情况下,OOP 是一个很好的研究..查看工厂模式和元编程..这一切都是关于重复使用和干燥
  • 我真的不知道你所说的“重用”是什么意思。你的意思是我应该为 3 个对象创建一个共享属性吗?那甚至都行不通,所以我假设不是它,那是什么?!我分配了 3 个单独的视图,因为我一次需要 3 个视图,而您是说我应该为所有这些视图只创建一个属性?这是如何运作的?我很困惑。
  • 重用只是意味着:不要分配与现有对象相同或几乎相同的新对象,不仅会阻塞主线程,还会造成内存泄漏
  • 但我已经知道了.. 我一遍又一遍地这么说,但你一遍又一遍地告诉我同样的事情.. 我需要同时呈现的对象是完全不同,并且所有相同或几乎相同的对象都被重复使用。一直以来,你一直在告诉我一些我已经知道并申请的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 2013-10-16
  • 2010-12-21
  • 1970-01-01
相关资源
最近更新 更多