OC当中野指针和内存泄露问题

定义一个Person类

其实引用计数这个问题大家可以理解为租房子的问题, 如果有retain alloc 代表这个人租了这间大房子, 拿到了一把钥匙, 引用计数代表房子一共有的钥匙的数量, release代表退房归还钥匙

        Person * p = [[Person alloc] init];//房东盖好了一间房子, 现在是房东一个人

        //alloc 开辟空间,引用计数由0变为1

        //retainCount,用于查看对象的引用计数

        NSLog(@"%lu", [p retainCount]);

       Person * p1 = [p retain];// retain一次, 代表又来一个人租房

       NSLog(@"p1 = %lu", [p1 retainCount]);//引用计数1-2

        NSLog(@"%lu", [p retainCount]);//引用计数1-2

Person * p2 = p1;//没有retain 也没有alloc 引用计数不变. 就相当于p1带他的朋友来住,朋友没有钥匙的

//release 减少引用计数(归还钥匙)

        [p release];//引用计数2-1

[p release];//引用计数1-0(但是如果我们去输出的话, 可能是会显示崩溃, 或者是1, 原因如下:)

NSLog(@"%lu", [p retainCount]);// 首先这样写肯定是不对的 , 最后一次release,系统已经回收掉这块内存,空间已经还给系统,空间已经不归你管理,如果此时在访问,就访问了一块没有所有权的空间,所以下面的操作可能会出现野指针问题

我们还以上面的租房子问题为例, 现在这间房子最后一个人已经走了, 已经没有人住了, 按说钥匙已经全部交上去了, 但是我们现在的操作就像是又拿着他的钥匙去开那个门, 这是非常不安全的.那为什么有时候会崩溃而有时候可以打印出1呢, 这是因为如果这块内存别人还没有使用, 就像是房子还没有租出去, 你再回去拿钥匙开门还是安全的, 但是如果这间房子又已经租出去, 即已经有别的数据在使用这块内存, 那你再回去开门, 那你的处境是相当的不安全有木有???

[p release];//野指针问题 +过渡释放,这个也很好理解, 大家可以理解成有房客拿一把钥匙, 不但要开门, 还要拿着这个钥匙再去归还一次, 要房东再次退房子押金, 违法了, 直接崩~


内存问题其实除了上面提到的野指针和过度释放, 还有一个, 那就是内存泄露, 内存泄露我们可以理解为, 一为租客租房子最后钥匙没有归还, 这样房东也没有办法打开这间房子, 这间房子就没有办法再租出去, 导致内存浪费, 当然, 房东在有别的房子出租的时候, 对于他来讲并没有太大的影响, 但是一旦这样的房客有好多,房子不够租, 房东挣钱会越来越慢, 最终可能导致做不下去


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内存泄漏(Memory Leak)指的是程序中已经分配的内存未被释放或者无法释放,导致系统内存的浪费。内存泄漏的结果可能是程序运行减慢甚至系统崩溃等后果。一些常见的内存泄漏情况包括:分配一个内存块并使用其中未经初始化的内容;释放一个内存块,但继续引用其中的内容;子函数中分配的内存空间在主函数出现异常中断时或主函数对子函数返回的信息使用结束时,没有对分配的内存进行释放;程序实现过程中分配的临时内存在程序结束时没有释放临时内存。内存泄漏一般是不可再现的,开发人员不易在程序调试和测试阶段发现,即使花费了很多精力和时间,也无法彻底消除。 空指针(Null)是指针初始化为Null,与未初始化的值不同。当一个指针被初始化为Null时,它指向的是一个无效的地址,也就是没有实际对象的地址。在使用一个空指针时,由于它指向无效的地址,可能会导致程序出错或崩溃。 在编程中,野指针(Wild Pointer)指的是指针指向的地址是随机的、未知的或者无效的。它通常是由于指针未正确初始化或指针指向的对象已经被释放而产生的。当使用野指针时,由于指针指向的地址是不确定的,可能会导致程序运行出错或崩溃。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [空指针 野指针 内存泄漏 内存溢出](https://blog.csdn.net/heneyT/article/details/119681009)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [OC野指针和空指针,僵尸对象和内存泄露](https://blog.csdn.net/weixin_29692653/article/details/117116086)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值