IOS小知识点5之内存警告、循环引用、交叉引用

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]

表明Test对Block强持有

同样交叉引用也是这样,A B类相互持有对象,导致对象无法销毁。解决的办法:

__weak DemoObj *weakSelf =self;

return[weakSelf Block:];


交叉引用时,两个对象中 属性设置为weak。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值