iOS:何为空指针和野指针

一:什么是空指针和野指针

1、空指针

①.没有存储任何内存地址的指针就成为空指针(NULL指针)

②.空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0.

复制代码
//以下都是空指针,eg:
Person *p1 = NULL;
Person *p1 = nil;

2、野指针

野指针不是NULL指针,是指向"垃圾"内存(不可用内存)的指针。

二:野指针和空指针样例

1、首先打开当前工程->Build Settings->Objective-c Automatic Reference Counting->NO

这样将ARC环境更改为MRC环境

2、自己定义Person类。在main函数中加入下列代码

执行程序。你会发现第21行报错了。是个野指针错误!

3、分析错误原因

①. 运行完第以下代码后,内存中有个指针变量p,指向了Person对象

复制代码
Person *p = [[Person alloc]init];

如果Person对象的地址为0xff43,指针变量p的地址为0xee45。p中存储的是Person对象的地址0xff43。即指针变量p指向了这个Person对象。

②.接着执行代码

复制代码
p.age = 10;

这行代码的意思是:给p所指向的Person对象发送一条setAge:消息,即调用这个Person对象的setAge:方法。眼下来说。这个Person对象仍存在于内存中。所以这句代码没有什么问题。

③.执行第20行代码

复制代码
[p release];

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

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

④.最后执行第21行代码

复制代码
p.age = 10;

这句代码的意思仍然是: 给p所指向的Person对象发送一条setAge:消息。可是在运行完第20行代码后。Person对象已经被销毁了,它所占用的内存已经是垃圾内存,假设你还去訪问这一块内存。那就会报野指针错误。这块内存已经不可用了,也不属于你了,你还去訪问它,肯定是不合法的。

所以。这行代码报错了。

4、代码纠正

复制代码
int main(int argc, char * argv[]) {
    NSString * appDelegateClassName;
    @autoreleasepool {
        // Setup code that might create autoreleased objects goes here.
        appDelegateClassName = NSStringFromClass([AppDelegate class]);
        
        Person *p = [[Person alloc]init];
        p.age = 10;
        [p release];
        p = nil;
        p.age = 10;
    }
    return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}

注意代码

复制代码
p = nil;

这时候p变成了空指针,p就不再指向什么内存了,也就是成为了空指针。

由于p是个空指针。没有指向什么对象,因此消息是发不出去的,不会造成什么影响。所以代码运行肯定也不会报错。

5、总结

①. 利用野指针发消息是非常危急的,会报错。也就是说,假设一个对象已经被回收了,就不要再去操作它,不要再尝试给它发消息。

②. 利用空指针发消息是没有什么问题的,也就是说以下的代码是没有错误的:

复制代码
[nil setAge:10];
相关推荐
恋猫de小郭几秒前
Flutter 又迎大坑修改?iOS 26 键盘变化可能带来大量底层改动
android·flutter·ios·kotlin
摘星编程44 分钟前
React Native for OpenHarmony 实战:DatePickerIOS iOS日期选择器
react native·react.js·ios
2501_915106321 小时前
如何在 iOS 设备上理解和分析 CPU 使用率(windows环境)
android·ios·小程序·https·uni-app·iphone·webview
怀君1 小时前
Uniapp——苹果IOS离线打自定义基座教程
ios·uni-app
TheNextByte12 小时前
如何将视频从 iPhone 传输到戴尔笔记本电脑?
ios·电脑·iphone
前端不太难2 小时前
Flutter / RN / iOS,在状态重构容忍度上的本质差异
flutter·ios·重构
摘星编程2 小时前
React Native for OpenHarmony 实战:WebView 网页视图组件
react native·react.js·ios
00后程序员张2 小时前
iOS 应用加固软件怎么选,从源码到IPA方案选择
android·ios·小程序·https·uni-app·iphone·webview
游戏开发爱好者82 小时前
iOS App 抓不到包时的常见成因与判断思路,结合iOS 调试经验
android·ios·小程序·https·uni-app·iphone·webview
小龙报2 小时前
【算法通关指南:算法基础篇 】贪心专题之简单贪心:1.最大子段和 2.纪念品分组
c语言·数据结构·c++·算法·ios·贪心算法·动态规划