iOS的空指针和野指针

在iOS中我们经常可以遇到空指针和野指针的情况,今天在这里就做一下总结,希望对大家有所帮助,也希望你们给予补充和纠正, 谢谢~~~

1.概念
1.1空指针

1> 没有存储任何内存地址的指针就称为空指针(NULL指针)。

2> 空指针就是被赋值为nil的指针,在没有被具体初始化之前,为nil。

1.2野指针

“野指针”不是nil指针,是指向”垃圾”内存(不可用内存)的指针。野指针是非常危险的。

示例:

Student *stu = [[Student alloc] init];

[stu setAge:10];

[stu release];这里已经释放内存

[stu setAge:10];—》报错

2.分析
示例分析

2.1 执行完第1行代码后,内存中有个指针变量stu,指向了Student对象

Student *stu = [[Student alloc] init];

假设Student对象的地址为0xff43,指针变量stu的地址为0xee45,stu中存储的是Student对象的地址0xff43。即指针变量stu指向了这个Student对象。

2.2接下来是第2行代码

[stu setAge:10];

这行代码的意思是:给stu所指向的Student对象发送一条setAge:消息,即调用这个Student对象的setAge:方法。目前来说,这个Student对象仍存在于内存中,所以这句代码没有任何问题。

2.3 接下来是第3行代码

[stu release];

这行代码的意思是:给stu指向的Student对象发送一条release消息。在这里,Student对象接收到release消息后,会马上被销毁,所占用的内存会被回收。

(release的具体用法会放到OC内存管理中详细讨论)

Student对象被销毁了,地址为0xff43的内存就变成了”垃圾内存”,然而,指针变量stu仍然指向这一块内存,这时候,stu就称为了野指针!

2.4最后执行了第4行代码

[stu setAge:10];

这句代码的意思仍然是:给stu所指向的Student对象发送一条setAge:消息。但是在执行完第3行代码后,Student对象已经被销毁了,它所占用的内存已经是垃圾内存,如果你还去访问这一块内存,那就会报野指针错误。这块内存已经不可用了,也不属于你了,你还去访问它,肯定是不合法的。所以,这行代码报错了!

如果改动一下代码,就不会报错

Student *stu = [[Student alloc] init];

[stu setAge:10];

[stu release];

stu = nil;

[stu setAge:10];

3.总结
野指针产生原因:

1.指针变量未初始化

任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。

2.指针释放后之后未置空

有时指针在free或delete后未赋值 NULL,便会使人以为是合法的。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。

3.指针操作超越变量作用域

不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值