ios nil、NULL和NSNull 的使用

简介: <p style="font-size:14px; border:0px; margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px; color:rgb(69,69,69); font-family:tahoma,helvetica,arial; line-height:21px"> nil用来给对象赋

nil用来给对象赋值(Objective-C中的任何对象都属于id类型),NULL则给任何指针赋值,NULL和nil不能互换,nil用于类指针赋值(在Objective-C中类是一个对象,是类的meta-class的实例), 而NSNull则用于集合操作,虽然它们表示的都是空值,但使用的场合完全不同。

示例如下:
  1. id object = nil;  
  2. // 判断对象不为空  
  3. if (object) {  
  4. }  
  5.       
  6. // 判断对象为空  
  7. if (object == nil) {  
  8. }  
  9.           
  10. // 数组初始化,空值结束  
  11. NSArray *array = [[NSArray alloc] initWithObjects:@"First", @"Second", nil];  
  12.   
  13. // 判断数组元素是否为空  
  14. NSString *element = [array objectAtIndex:2];  
  15. if ((NSNull *)element == [NSNull null]) {  
  16. }  
今天做项目的时候就遇到,要判断数组元素是否为空,我的以下写法,都无效
if(!element)
if([element length]>0)
if(element== NULL)
if(element == Nil)


  1.   
  2. // 判断字典对象的元素是否为空  
  3. NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:  
  4.     @"iPhone", @"First", @"iPad", @"Second", nil];  
  5. NSString *value = [dictionary objectForKey:@"First"];  
  6. if ((NSNull *)value == [NSNull null]) {  
  7. }  
欢迎大家继续补充他们的区别。
加深理解一

1、nil:一般赋值给空对象;

2、NULL:一般赋值给nil之外的其他空值。如SEL等;

  举个栗子(好重啊~):

    [NSApp beginSheet:sheet
                modalForWindow:mainWindow

                modalDelegate:nil //pointing to an object

                didEndSelector:NULL //pointing to a non object/class

                contextInfo:NULL]; //pointing to a non object/class

3、NSNULL:NSNull只有一个方法:+ (NSNull *) null;

  [NSNull null]用来在NSArray和NSDictionary中加入非nil(表示列表结束)的空值.   [NSNull null]是一个对象,他用在不能使用nil的场合。

4、当向nil发送消息时,返回NO,不会有异常,程序将继续执行下去;

  而向NSNull的对象发送消息时会收到异常。

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

+ (NSNull *) null;


nil是一个对象指针为空,Nil是一个类指针为空,NULL是基本数据类型为空。这些可以理解为nil,Nil, NULL的区别吧。



加深理解二

浅谈关于nil和 null区别及相关问题

 

 

1、nil和null从字面意思来理解比较简单,nil是一个对象,而NULL是一个值,我的理解为nil是将对象设置为空,而null是将基本类型设置为空的,个人感觉有点像属性当中,基本类型分配为assign NSString类型一般分配copy,而对象一般用retain。而且我们对于nil调用方法,不会产生crash或者抛出异常。

看一段

nil -> Null-pointer to objective- c object

NIL -> Null-pointer to objective- c class

null-> null pointer to primitive type or absence of data.

看一下用法

NSURL *url = nil;

Class  class = Nil;

int *pointerInt = NULL;

nil是一个对象指针为空,Nil是一个类指针为空,NULL是基本数据类型为空。这些可以理解为nil,Nil, NULL的区别吧。

2、一个可以研究一下的问题

在dealloc中

-(void) dealloc

{

self.test = nil; 

[_test release];

test = nil;

}

这几个的区别

先说最简单的  [_test release]; 这个就是将引用技术减1,所谓的引用计数就是看看有多个指针指向一块内存实体,当release一次,就是指针减少一个,release到了0的时候,就是真正把这块内存归还给系统的时候了


再说self.test = nil;说明一下 属性和setter和getter方法就不难理解了


-(void) setTest:(NSString *)newString

{

if(_test != newString)

[_test release];

_test = [newString retain];

}

-(NSString *)test

{

return  _test;

}

这个是setter和getter方法,而在这个问题中相当于刚才的代码改变为

if(_test != nil)

[_test release];

_test = nil;

现在就比较容易解释了,setter方法会retain nil对象,在这之前已经先release了旧的对象,这个方法优点是成员变量连指向随机数据的机会都没有,而通过别的方式,就可能会出现指向随机数据的情况。当release了之后,万一有别的方法要用要存取它,如果它已经dealloc了,可能就会crash,而指向nil之后,就不会发生错误了。nil说白了就是计数器为0,这么说吧,当真正release一个对象的时候,NSLog是打印不了它指向的内存控件的,而当nil的时候,是可以打印出来指向的一个内存空间。

那么现在也不难解释test = nil;  单纯的这种用法可以说是自己给自己制造内存泄露,这里可以这么理解,就是相当于将指向对象的指针直接和对象一刀两断了。直接让test指向nil,而内存实体不会消失,也不会有系统回收。

目录
相关文章
iOS中nil 、NULL、 Nil 、NSNull,你真的了解吗?
今天突然间对nil和NULL产生了疑问,就在网上查了一下相关的问题,看完之后终于有了清晰的认识,跟我一样有疑问的童鞋们可以看看。
iOS 给字典中插入nil的几种情景
NSString *str = nil; NSDictionary *dic = @{@"key":str}; //zs20171220 会崩溃'*** -[__NSPlaceholderDictionary initWithObjec...
1722 0
iOS 处理服务器返回的数据字符串为之 Null
昨晚遇到了无法将服务器返回的数据写在 plist 文件中的问题。我尝试打印了服务器返回的数据,发现好几项值为 Null !!! Null !!! 经过各种折腾之后 GitHub 上找到了爽快的解决处理服务器返回的数据字符串为 的方法。
1217 0
iOS - OC NSNull 空值
前言 @interface NSNull : NSObject 作为占据空间的一个空值,如用在数组或字典中占据一个没有任何值的空间。 NULL & nil 的区别: nil 是 OC 的,空对象,地址指向空的对象,指针地址指向的是 NULL。
1290 0
iOS - Swift NSNull 空值
前言 public class NSNull : NSObject, NSCopying, NSSecureCoding 作为占据空间的一个空值,如用在数组或字典中占据一个没有任何值的空间。 1、NSNull 的创建 // 返回一个单例类对象 let nl:NSNull ...
1196 0
iOS接收null的处理方法
经常服务器返回的数据,有null,还有nil,如果在模型层不处理的话,到时候数据展现时,一定会崩啊,最近决心要解决这个问题,所以查看了一些资料后,有答案了: - (id) setNoNull:(id)aValue{ if (aValue == ...
891 0
IOS中类和对象还有,nil/Nil/NULL的区别
类与对象的概念 类是对同一类事物高度的抽象,类中定义了这一类对象所应具有的静态属性(属性)和动态属性(方法)。 对象是类的一个实例,是一个具体的事物。
1040 0
实时计算 Flink版产品使用合集之从MySQL同步数据到Doris时,历史数据时间字段显示为null,而增量数据部分的时间类型字段正常显示的原因是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。

热门文章

最新文章

  • 1
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    21
  • 2
    iOS|解决 setBrightness 调节屏幕亮度不生效的问题
    21
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    3
  • 4
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    2
  • 5
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    6
  • 6
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    1
  • 7
    iOS各个证书生成细节
    5
  • 8
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    6
  • 9
    Image provider: AssetImage(bundle: null, name: “assets/images/hot.png”) Image key: AssetBundleImageKey(bundle: PlatformAssetBundle#9d9f7(), name: “assets/images/hot.png”, scale: 1) 图像无法加载,并且其他图标图像也出错的解决方案-优雅草卓伊凡
    1
  • 10
    iOS:应用程序的线程安全性
    1
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等