所以我对 objC 编程比较陌生。但不是 C。在一个更复杂的应用程序中,我认为我有内存泄漏。我编写了这个程序只是为了进行一些测试。该应用程序非常简单:它将一系列整数存储在 MutableArray 中,这些整数表示已安排的计时器。该应用程序在当前运行循环中有一个 NSTimer,它每秒检查一次是否是将计数器与 MutableArray 的正确元素进行比较的正确时间。一切正常,但调试面板中的内存增长,增长,增长......
我已经尝试了一些变体,但我仍然缺少关于 ARC 的一些东西。我只是不明白,因为 ARC 不是垃圾收集器,为什么内存会增长以及我做错了什么。
这是代码:
-(id)initWithLabelUILabel *)label {
self = [super init];
self.list = [[mtAllarmList alloc]init];
self.label = label;
return self;
}
-(void)ClockRun {
NSMethodSignature * signature = [mtClockController instanceMethodSignatureForSelectorselector(check)];
NSInvocation * selector = [NSInvocation invocationWithMethodSignature: signature];
[selector setTarget:self];
[selector setSelectorselector(check)];
[[NSRunLoop currentRunLoop] addTimer: self.time = [NSTimer scheduledTimerWithTimeInterval:1
invocation:selector
repeats:YES]
forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] runUntilDate:[[NSDate alloc]initWithTimeIntervalSinceNow: 30]];
}
-(void)check {
self.counter++;
int i = [self.list check:self.counter];
if(i == 1) {
[self writeAllarmToLabel:self.label isPlayingAllarmNumber:self.counter];
}
else if (i == 2) {
[self writeAllarmToLabel:self.label theString: @"Stop"];
[self.time invalidate];
self.counter = 0;
}
else {
[self writeAllarmToLabel:self.label theString:[[NSString alloc]initWithFormat"controllo, %d", self.counter]];
}
NSLog(@"controllo %d", self.counter);
}
-(id)init {
self = [super init];
self.arrayOfAllarms = [[NSMutableArray alloc]initWithCapacity:0];
int i;
for(i=1;i<=30;++i) {
[self.arrayOfAllarms addObject: [[NSNumber alloc]initWithInt:i*1]];
}
for(NSNumber * elemento in self.arrayOfAllarms)
NSLog(@"ho creato un array con elemento %d", [elemento intValue]);
return self;
}
-(int)checkint)second {
int maxValue = [[self.arrayOfAllarms lastObject] intValue];
if(maxValue == second){
self.index = 0;
return 2;
} else {
if ([[self.arrayOfAllarms objectAtIndex:self.index] intValue] == second) {
self.index++;
return 1;
} else {
return 0;
}
}
}
由于您是在主运行循环中执行此操作,因此您可以(并且应该)简化 ClockRun
方法:
- (void)ClockRun {
self.time = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selectorselector(check) userInfo:nil repeats:YES];
}
NSInvocation
代码是不必要的,NSRunLoop
代码只能引入问题。mtClockController
处的 View Controller 之间的对象图.或者 View Controller 中的一些循环引用(例如,从 A 推送到 B 并再次推送到 A)。根据迄今为止提供的内容,很难说。mtClockController
?dealloc
告诉我对象何时被释放的方法,例如:- (void)dealloc {
NSLog(@"%s", __PRETTY_FUNCTION__);
}
UIKit
相关联的 Cocoa 内部对象和 NSString
. Cocoa Touch 会在幕后缓存我们无法控制的各种内容。我做最后的“模拟器内存警告”的原因是让 Cocoa 有机会清除它所能清除的东西(你会看到,尽管 Generations 报告了什么,总分配量下降了一点)。mt
限制 Instruments 仅记录您的类的信息。前缀(您可以通过停止记录仪器并点击分配图上的“i”按钮并配置“记录类型”来完成此操作),您将看到您期望的图表/世代类型:关于ios - 为什么这个带有 ARC 的简单应用程序会泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23202727/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |