您的位置:首页 > 其它

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

2015-12-25 13:08 573 查看
今天遇到这个问题,就是前面创建对象是这样创建的

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


然后想判断其中一个为空的时候执行某方法.但是以下这个做法是错误的:
NSString *stuName =  [m_infos objectAtIndex:1];

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

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

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

   }


接下来分析:

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他们都是指向空的指针的

所以我用了这句就行啦
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。

       黑码哥

_viewControllers = [[NSMutableArray alloc] init];  

for (unsigned i = 0; i < _pages; i++) {  
[_viewControllers addObject:[NSNull null]];  
}  
ymBaseController *controller = [_viewControllers objectAtIndex:page];  
         if ((NSNull *)controller == [NSNull null])   
    {  
...  
            }  
    [_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 ================

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 ================

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 ================

NSNULL是一个类,它代表空值

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

用途:用于表示集合值为空的对象(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: