IOS的内存使用有以下几个等级,最常见的就是OSMemoryNotificationLevelWarning OSMemoryNotificationLevelUrgent
typedef enum {
OSMemoryNotificationLevelAny = -1,
OSMemoryNotificationLevelNormal = 0,
OSMemoryNotificationLevelWarning = 1,
OSMemoryNotificationLevelUrgent = 2,
OSMemoryNotificationLevelCritical = 3
} OSMemoryNotificationLevel;
Iphone4 设备中内存512M,一般在应用使用内存达到50M(这个数据有可能不准确),会收到第一次内存警告,在达到200M多点,会收到第二次内存警告,这个时候手机直接强制关闭应用,就是我们常说的闪退。等级3是更为严重的内存警告,这种情况下,IOS系统直接接管手机,开始对内存进行管理,这个时候手机甚至有可能会重启。
在哪些地方处理这些警告:
(1)在应用程序的AppDelegate方法中可以回调:
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{ 处理内存警告方法 }
{ 处理内存警告方法 }
(2)视图控制器
- (void)didReceiveMemoryWarning
(3)通知
UIApplicationDidReceiveMemoryWarningNotification通知,凡是在通知中心注册了UIApplicationDidReceiveMemoryWarningNotification通知的类都会接收到内存警告通知。
循环引用、交叉引用:
对象能销毁的基本原则是没有对象对这个资源进行强引用或者持有。
看一个经典的循环引用的例子:
首先在self中定义一个强引用对象:
@property(nonatomic, strong) NSMutableArray *Test;
那么表示self对Test是强持有的。
然后定义一个Block
int(^Block)() = ^() {
return [self Block:];
};
这里Block对self强持有。
如果这时我们添加了添加了代码:
[self.Test addObject:Block]
同样交叉引用也是这样,A B类相互持有对象,导致对象无法销毁。解决的办法:
__weak DemoObj *weakSelf =self;
return[weakSelf Block:];
交叉引用时,两个对象中 属性设置为weak。