nil Nil null @”” 关于nil和 null和NSNull的区别及相关问题||(null) <null> nil 问题「终于解决」

nil Nil null @”” 关于nil和 null和NSNull的区别及相关问题||(null) <null> nil 问题「终于解决」今天遇到这个问题,就是前面创建对象是这样创建的m_infos=[[NSMutableArrayalloc]initWithObjects:@””,@””,@””,@””,@””,@””,@””,@””,@””,@””,nil];然后想判断其中一个为空的时候执行某方法.但是以下这个做法是错误的:NSString*stuName= [m_infosobjectA

今天遇到这个问题,就是前面创建对象是这样创建的

 
 
 
  1. m_infos = [[NSMutableArray alloc] initWithObjects:@"",@"",@"",@"",@"",@"",@"",@"",@"",@"", nil];

然后想判断其中一个为空的时候执行某方法.但是以下这个做法是错误的:

 
 
 
  1. NSString *stuName =  [m_infos objectAtIndex:1];

  2. //这里不走if,直接跳过去

  3. if (stuName == nil || [stuName isEqual:[NSNull null]] == YES ]) {

  4.        [self showErrorHubContent:@"学生姓名不能为空"];

  5.    }


接下来分析:

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的区别吧。

你可以看出nil,Nil他们都是指向空的指针的

所以我用了这句就行啦

 
 
 
  1. if (stuName == nil || [stuName isEqual:[NSNull null]] == YES || [stuName isEqualToString:@"" ])

在后边加了一句[stuName isEqualToString:@""]    

这样就可以了。

2、NSNULL,NULL和nil在本质上应该是一样的,NULL和nil其实就是0,但是在Objective-c中,对于像NSArray这样的类型,nil或NULL不能做为加到其中的Object,如果定义了一个NSArray,为其分配了内存,又想设置其中的内容为空,则可以用[NSNULL null返回的对对象来初始化NSArray中的内容,我的感觉有点像C语言中malloc一个内存空间,然后用memset初始化这段空间里的值为0。

       黑码哥

  1. _viewControllers = [[NSMutableArray alloc] init];  

  2. for (unsigned i = 0; i < _pages; i++) {  
  3. [_viewControllers addObject:[NSNull null]];  
  4. }  
  5. ymBaseController *controller = [_viewControllers objectAtIndex:page];  
  6.          if ((NSNull *)controller == [NSNull null])   
  7.     {  
  8. …  
  9.             }  
  10.     [_viewControllers replaceObjectAtIndex:page withObject:contro



下方为转载内容:

转自:https://my.oschina.net/shoutan/blog/513764

你有没有过这样的经历,就是界面上显示出类似<null>、(null)这样一些东西,有时候还会莫名其妙的闪退。反反复复真是曰了犬,今天来总结一下这个问题的解决方法

前段时间开发过程中,界面上莫名其妙的有些地方显示(null)有些地方显示 <null>,修改起来很蛋疼,经过查找资料来总结一下其中的微妙,免得以后再在这个东西上花无谓的时间去修改。


首先记录一下我遇到这类问题的解题思路,最简单直接的方法是:首先定位到出问题的位置,然后用暴力方式把这个变量打印出来!

打印分两种:①%p打印地址;②%@打印对象的描述(字符串对象就是其本身)

本文先说结论再展开来讲。

总结:0. nil、NULL本质上是相同的,都指向0x0地址,[NSNULL null]是一个对象,存储在常量区,占用着固定地址。

         1.nil 表示一个指针指向的对象为空,这个对象的类型是id,显示出来是(null)—>常见于非集合类中

         2.[NSNull null] 表示空对象本身,显示出来是<null> ————————–>常见于集合类中

         3.NULL 和 nil,没有实质区别,只不过前者是C语言只中的

下面详细来讲解一下三者区别

============== nil ================

  1. nil是OC对象字面空值 ,这个对象的类型是id.

    NSString *str = nil;
     NSData *data = nil;
      NSLog(@"%@",nil);
     NSLog(@"%@",str);  
     NSLog(@"%@",data); 
      NSLog(@"%p",nil);
     NSLog(@"%p",str);  
     NSLog(@"%p",data); 
     NSLog(@"%d",(data == nil));
     
    2015-10-06 13:13:45.338 test[95730:5489376] (null)
    2015-10-06 13:13:45.338 test[95730:5489376] (null)
    2015-10-06 13:13:45.338 test[95730:5489376] (null)
    2015-10-06 13:13:45.338 test[95730:5489376] 0x0
    2015-10-06 13:13:45.338 test[95730:5489376] 0x0
    2015-10-06 13:13:45.338 test[95730:5489376] 0x0
    2015-10-06 13:13:45.338 test[95730:5489376] 1

2. 空对象在控制台打印出来是(null)

3. nil定义

// objc.h#ifndef NULL#define NULL    __DARWIN_NULL#endif /* ! NULL */#ifndef nil  #if defined(__has_feature)     #if __has_feature(cxx_nullptr)      #define nil nullptr    #else      #define nil __DARWIN_NULL    #endif  #else    #define nil __DARWIN_NULL  #endif#endif// __DARWIN_NULL in _types.h #define __DARWIN_NULL ((void *)0)

===========NULL ================

  1. NULL是任意的C指针空值

    int *pointerToInt = NULL;char *pointerToChar = NULL;struct TreeNode *rootNode = NULL;NSLog(@"%@",pointerToInt);NSLog(@"%s",pointerToChar); NSLog(@"%@",rootNode);NSLog(@"%d",pointerToInt==NULL);  //NSLog(@"%d",pointerToInt==nil);   //2015-10-06 13:38:59.927 test[95925:5515192] (null)2015-10-06 13:38:59.927 test[95925:5515192] (null)2015-10-06 13:38:59.927 test[95925:5515192] (null)2015-10-06 13:38:59.927 test[95925:5515192] 12015-10-06 13:38:59.927 test[95925:5515192] 1

2. 控制台打印出来是(null)

3. 定义

#ifndef NULL#define NULL    __DARWIN_NULL#endif /* ! NULL */

===========NSNULL ================

  1. NSNULL是一个类,它代表空值

  2. NSNULL只有一个单例方法 [NSNull null]

  3. 用途:用于表示集合值为空的对象(oc中nil是不能存放在集合中的,因为nil是集合结束的标志位)

    NSArray *arr = [NSArray arrayWithObjects:@"one",@"two",[NSNull null], nil];        for (NSString *str in arr) {            NSLog(@"%@",str);        }2015-10-06 16:40:25.816 test[96177:5565855] one2015-10-06 16:40:25.817 test[96177:5565855] two2015-10-06 16:40:25.817 test[96177:5565855] <null>

 4. 此时控制台打印出来的是<null>

5. 定义

/*	NSNull.h	Copyright (c) 1994-2015, Apple Inc. All rights reserved.*/#import <Foundation/NSObject.h>NS_ASSUME_NONNULL_BEGIN@interface NSNull : NSObject <NSCopying, NSSecureCoding>+ (NSNull *)null;@endNS_ASSUME_NONNULL_END

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/10559.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注