【发布时间】: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