iOS内存警告

1.当iOS系统内存不足,会发出内存警告的通知。
首先调用的是 AppDelegate 里重新的内存警告代理方法

 - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
 {
     NSLog(@"内存在警告时会AppDelegate中applicationDidReceiveMemoryWarning调用");
    }

2.可以在控制器里注册内=内存警告的通知

//控制器注册警告通知
-(void) regMemoryWarning{
 NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
     [center addObserver:self
        selector:@selector(handleMemoryWarning)
        name:UIApplicationDidReceiveMemoryWarningNotification
        object:nil];
}
//警告通知回调方法
-(void) handleMemoryWarning
 {
      NSLog(@"ViewController中handleMemoryWarning调用");
     }

//控制器自动调用的内存警告方法(如果控制器注册了内存警告通知,那么,当程序发生内存警告的时候,会优先调用通知方法,后调用控制器的)didReceiveMemoryWarning方法)。
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    NSLog(@"viewcontroller 的didReceiveMemoryWarning调用");
}

总结:
当发生内存警告的时候就会接收通知,调用通知方法,进行处理响应的事情。
内存警告的优先级调用顺序是 AppDelegate的- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application方法 >控制器的UIApplicationDidReceiveMemoryWarningNotification通知方法>控制器的didReceiveMemoryWarning方法

2.怎么模拟iOS内存警告呢?
(1)真机模拟内存警告
SEL sel = NSSelectorFromString([@"_perform" stringByAppendingString:@"MemoryWarning"]); // Private API
assert([[UIApplication sharedApplication] respondsToSelector:sel]);
[[UIApplication sharedApplication] performSelector:sel];

(2)模拟器的模拟内存警告
在好多大牛的帖子里看到的是这样的操作:模拟器菜单:Hardware-》Simulate Memory Warning
当是我在操作的时候就是找不到后面的选项Simulate Memory Warning


屏幕快照 2018-11-14 上午10.53.39.png

当是我的心里一万个不爽啊!(我当时用的是Xcode9.4)
后来我在Debug 的选项里看到了后面的 Simulate Memory Warning选择,所以我的操作是Debug-》Simulate Memory Warning


屏幕快照 2018-11-14 上午10.57.48.png

就是这样操作,就可以检验上面所写的当程序发生内存警告的时候,调用方法的顺序实现了。

3.当内存发生警告的时候,我们应该做什么样的操作呢?
(1)当我们在下载高清的图片和视频的时候,是很容易发生内存警告的,如果使用了SDWebImage框架,使用如下代码,可以有效的减少内存:
[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];//清除内存中通过SDWebImage框架下载的图片,建议在收到内存警告时在调用
(2) //在收到内存警告时,控制器里调用以下代码:

    if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0) {
            if (self.isViewLoaded && !self.view.window){
            
                   //释放其他可复现的资源&&保存数据
            
                    self.view = nil;//目的是再次进入时能够重新加载调用viewDidLoad函数。
            
                }        
    }

iOS 给每个应用的缓存数据是 20M ,这个我也是从大量的帖子里,看到的答案,有待考证和探讨。希望大家来一起讨论和研究!

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 更多内容请挪步我的博客 [LEAF Photo] 中要处理图片,如果操作时间长的话会收到 Memory Warni...
    AliciaRain阅读 5,369评论 1赞 7
  • 1.当应用程序收到内存警告时,AppDelegate中的- (void)applicationDidReceive...
    cssshuang阅读 1,235评论 5赞 1
  • 今天在4S真机上频繁发生闪退问题,并且在控制台打印:Received memory warning.打印三次之后就...
    丸_子阅读 5,315评论 0赞 3
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,855评论 1赞 32
  • 前两天在读于丹的《重温最美古诗词》,她在写田园诗的时候讲起了几首陶渊明的诗,有一首里面其中几句是这样的: 方宅十余...
    我是安心阅读 331评论 0赞 1

友情链接更多精彩内容