我有一个问题应用程序,基于导航,我创建并每次从笔尖推送我的tableviews。没有泄漏,仪器中的实时字节大约为2-3 MB。
我在真实设备(越狱的IOS4 iPhone)中测试过,当我深入导航(大约200页推送)时,我可以看到内存使用量高达150 MB!当我导航回root时,他们都被释放了,但这不是一个奇怪的行为吗? (每个笔尖视图大约800 KB,其中没有大数据或图像)
最奇怪的是,我对didreceivememorywarning和didunloadview方法发出了警告,但没有收到任何内存警报!
- 为什么我从来没有得到任何内存警告和viewDidUnload甚至应用程序使用150 MB和更多的内存? - 应用程序有效,但这个内存使用对Apple商店来说是个问题吗?
答案 0 :(得分:16)
有些东西正在发生。请尝试以下代码来检查应用程序使用的内存的操作系统版本
-(void) report_memory {
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self(),
TASK_BASIC_INFO,
(task_info_t)&info,
&size);
if( kerr == KERN_SUCCESS ) {
NSLog(@"Memory in use (in bytes): %u", info.resident_size);
} else {
NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
}
}
你需要#import“mach / mach.h”
这将告诉您操作系统为您的应用授予了多少内存。因此,如果您看到的是一些奇怪的乐器行为,这应该会有所启发。
答案 1 :(得分:2)
我只是在viewDidDisappear方法中添加self.view = nil,它可以正常恢复,现在好多了。 tnx Felz的帮助
答案 2 :(得分:0)
老问题,但补充了fsaint的答案,以防有人仍想知道如何使用它:
它可以放在您想要记录内存使用的任何位置,例如在特定的视图控制器中。要记录整个应用程序,您可以使用AppDelegate.m。在文件的顶部:
#import <mach/mach.h>
将方法粘贴到类中的任何位置:
- (void) report_memory {
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self(),
TASK_BASIC_INFO,
(task_info_t)&info,
&size);
if( kerr == KERN_SUCCESS ) {
long mb = info.resident_size / 1000000;
NSLog(@"Memory in use (in Mbytes): %lu", (long)mb);
} else {
NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
}
}
包含一个计时器,用于从didFinishLaunchingWithOptions调用此方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
(...)
[NSTimer scheduledTimerWithTimeInterval: 2.0
target: self
selector: @selector(report_memory)
userInfo: nil
repeats: YES];
}
运行应用程序并观察日志以了解内存使用情况。