• iOS之iOS中的(null)、<null>、 nil 的问题


     
    摘要: 你有没有过这样的经历,就是界面上显示出类似<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 <NSCopyingNSSecureCoding>
    
    + (NSNull *)null;
    
    @end
    
    NS_ASSUME_NONNULL_END

    参考资料:http://stackoverflow.com/questions/5908936/difference-between-nil-nil-and-null-in-objective-c

                http://blog.csdn.net/shenshen123jun/article/details/38315755

                 https://github.com/nicklockwood/NullSafe

     
  • 相关阅读:
    js对象的所有方法
    js数组的所有方法
    Scss语法
    new一个对象的过程
    promises的深入学习
    jsonp的原理介绍及Promise封装
    Vue页面缓存和不缓存的方法
    JavaScript数据类型
    JS常用函数原理的实现
    @Autowired注解在抽象类中实效的原因分析
  • 原文地址:https://www.cnblogs.com/rglmuselily/p/6489474.html
Copyright © 2020-2023  润新知