小结:

1.oc最好用nil   [ nil  任意方法],不会崩溃

nil是一个对象值。

NULL是一个通用指针(泛型指针)。

2. NSNULL,NULL和nil在本质上应该是一样的,NULL和nil其实就是0,但是在Objective-c中,对于像NSArray这样的类型,nil或NULL不能做为加到其中的Object,如果定义了一个NSArray,为其分配了内存,又想设置其中的内容为空,则可以用[NSNULL null返回的对对象来初始化NSArray中的内容,

3.因为在NSArray和NSDictionary中nil中有特殊的含义(表示列表结束),所以不能在集合中放入nil值。如要确实需要存储一个表示“什么都没有”的值,可以使用NSNull类。NSNull只有一个方法:

+ (NSNull *) null;

nil表示一个对象指针为空,针对对象 >示例代码: NSString *someString = nil; NSURL *someURL = nil; id someObject = nil; if (anotherObject == nil) // do something Nil表示一个类指针为空,针对类 >示例代码: Class someClass = Nil; Class anotherClass = [NSString class]; NULL表示基本数据类型为空,基本类型 >示例代码: int *pointerToInt = NULL; char *pointerToChar = NULL; struct TreeNode *rootNode = NULL; NSNull:在集合对象中,表示空值的对象。

nil和release的作用:
 
nil就是把一个对象的指针置为空,只是切断了指针与内存中对象的联系;而release才是真正通知内存释放这个对象,但是在IOS中其实也不会立马释放内存,而是将内存计数器剪去1,直到计数器变为0,才会释放掉内存,所以release的目的是为了释放内存,而self.object = nil,是清空指针。
 
所以nil并没有释放内存,只有release才回真正释放内存。
 
二者使用的先后顺序:
 
如果没有release就直接nil,那么虽然不会出错,却等于自己制造内存泄漏了,因为nil之后release就已经不起作用了。
 
相反,如果在使用接口对象时只仅仅release没有设置self.myOutlet = nil,那么程序可能也不会报错,但却会十分不稳定、不健壮,很容易发生崩溃现象。
 
因为一个接口对象在release之后,给它所分配等内存就已经被释放了,如果释放之后系统再用到这个对象,那么程序就会crash。
 
如果释放之后把它的指针置为空,则即便后面的程序用到该对象,也不会崩溃。

1,

nil:指向oc中对象的空指针

Nil:指向oc中类的空指针

NULL:指向其他类型的空指针,如一个c类型的内存指针

NSNull:在集合对象中,表示空值的对象

若obj为nil:

[obj message]将返回NO,而不是NSException

若obj为NSNull:

[obj message]将抛出异常NSException


 
2,
nil和NULL从字面意思来理解比较简单,nil是一个对象,而NULL是一个值,我的理解为nil是将对象设置为空,而NULL是将基本类型设置为空的。而且我们对于nil调用方法,不会产生crash或者抛出异常。
看一下用法
NSURL *url = nil;
Class class = Nil;
int *pointerInt = NULL;
nil是一个对象指针为空,Nil是一个类指针为空,NULL是基本数据类型为空。

这五个概念很容易混淆,在一些场合下他们具有同样的用法。首先解释一下“空指针”意思,空指针是指该指针未指向一块有意义的内存区。如int *p; int *p = NULL;

NSObject *obj1 = [[NSObject alloc] init];

NSObject *obj2 = [NSNull null];

NSObject *obj3 = [NSObject new];

NSObject *obj4;

NSArray *arr1 = [NSArray arrayWithObjects:obj1, obj2, obj3, obj4, nil];

NSLog(@"arr1 count: %ld", [arr1 count]); //count: 3 因为obj=nil,在加入obj4时就结束添加对象

NSObject *obj1;

NSObject *obj2 = [[NSObject alloc] init];

NSObject *obj3 = [NSNull null];

NSObject *obj4 = [NSObject new];

NSArray *arr2 = [NSArray arrayWithObjects:obj1, obj2, obj3, obj4, nil];

NSLog(@"arr2 count: %ld", [arr2 count]); //count: 0,因为obj1=nil,所以后面的对象没有添加进去

[NSNull null]通常作为占位符作用,如下:

 

NSObject *obj1 = [NSNull null];

NSArray *arr1 = [NSArray arrayWithObjects:@"One", @"TWO", obj1,@"three",nil];

for (NSString *str in arr1) {

NSLog(@"array object: %@", str);

} //result:One、Two、、three

NSObject *obj1 = [NSNull null];

NSArray *arr1 = [NSArray arrayWithObjects:@"One", @"TWO", obj1,@"three",nil];

for (NSString *str in arr1) {

if (str != [NSNull null]){

NSLog(@"array object: %@", str);

}

}//result:One、Two、three

转自:http://blog.sina.com.cn/s/blog_5fb39f910101akm1.html

(0047)iOS开发之nil/Nil/NULL的区别相关推荐

  1. iOS开发之Objective-C(基础篇)-李飞-专题视频课程

    iOS开发之Objective-C(基础篇)-232人已学习 课程介绍         该系列课程是iOS开发之Objective-C基础入门视频.课程中会详细的讲解OC语法特点,面向对象的使用,循环 ...

  2. (0045) iOS 开发之MBProgressHUD 源码学习

    (0045) iOS 开发之MBProgressHUD 源码学习 第一部分:学习所得和分析线程 1.  学习到了kvo 的使用 和屏幕方向的旋转判断. 2. 如果调起这个 HUD 的方法不是在主线程调 ...

  3. 李洪强iOS开发之RunLoop的原理和核心机制

    李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研 ...

  4. IOS开发之UI基础LOL英雄展示-15

    IOS开发之UI基础LOL英雄展示-15 // // ViewController.m // 15-英雄展示-单组数据 // // Created by 鲁军 on 2021/2/3. //#impo ...

  5. ios html清除缓存,iOS开发之1行代码实现缓存计算及清除缓存

    话不多说,直接撸代码 // // gzhCache.h // cache // // Created by 郭志贺 on 2020/5/27. // Copyright © 2020 郭志贺. All ...

  6. iOS开发之Accounts框架详解

    2019独角兽企业重金招聘Python工程师标准>>> iOS开发之Accounts框架详解 Accounts框架是iOS原生提供的一套账户管理框架,其支持Facebook,新浪微博 ...

  7. iOS开发之Xcode常用调试技巧总结

    转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...

  8. 图片轮播c语言,IOS开发之UIScrollView实现图片轮播器的无限滚动

    IOS开发之UIScrollView实现图片轮播器的无限滚动 简介 在现在的一些App中常常见到图片轮播器,一般用于展示广告.新闻等数据,在iOS内并没有现成的控件直接实现这种功能,但是通过UIScr ...

  9. iOS开发之UI开发(UITableView)

    UITableView 继承自UIScrollView,性能极佳 UITableView的两种样式 UITableViewStylePlain列表样式 UITableViewStyleGrouped ...

最新文章

  1. Windows保护模式学习笔记(十三)—— PWTPCD
  2. python控制autocad_利用python控制Autocad:pyautocad方式
  3. Xilinx FPGA GTX的DRP速率配置详解
  4. nusoap php 7,nusoap-用php的NuSoap 访问webservice遇到的问题。
  5. 深入Java类型信息:RTTI和反射
  6. 美剧迷失_迷失(机器)翻译
  7. 人工智能及其体系结构_一些复制体系结构错误及其解决方案
  8. java程序(1016)
  9. idea的黄色感叹号之Spring Configuration Check (Please configura/setup Spring facet for modules)
  10. 在线光纤网速测试软件,adsl网速测试(中国移动宽带专用测速软件)
  11. pe下修复linux磁盘分区,找回丢失的Linux分区及Grub修复过程
  12. ES6,ES5,ES3,对比学习~
  13. 贝壳DMP平台建设实践
  14. 外服游戏服务器如何显示中文,避免国外服务器出现乱码的办法
  15. mybatis一个怪异的问题: Invalid bound statement not found 作者及来源: babyblue - 博客园 收藏到→_→: 摘要: mybatis一个怪异
  16. 从0到1构建计算机(3/12)--组合逻辑芯片:逻辑门、加法器、ALU
  17. 使用手机号登录、注册、重置密码
  18. python运行调出控制台_python控制台怎么打开
  19. Protractor 怎么编写自动化测试用例
  20. Vue中mixin的使用

热门文章

  1. RecyclerView 使用指南
  2. CAS (3) —— Mac下配置CAS客户端经代理访问Tomcat CAS
  3. apache-shiro杂记(三) 用了apache-shiro后,HttpSession.getServletContext() API无法正常工作了...
  4. 对ActiveRecord的评论
  5. GARFIELD@07-12-2005 DILBERT
  6. 企业项目开发--分布式缓存memcached(3)
  7. 图解插入排序--直接插入排序
  8. EC笔记:第4部分:19、设计class犹如设计type
  9. Tomcat报错:Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]
  10. centos 7 yum 安装 python3