nil Nil null @"" 关于nil和 null和NSNull的区别及相关问题||(null) <null> nil 问题

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

 
 
  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] 1
    2015-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] one
    2015-10-06 16:40:25.817 test[96177:5565855] two
    2015-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;

@end

NS_ASSUME_NONNULL_END




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值