今天遇到这个问题,就是前面创建对象是这样创建的
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
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>,修改起来很蛋疼,经过查找资料来总结一下其中的微妙,免得以后再在这个东西上花无谓的时间去修改。
首先记录一下我遇到这类问题的解题思路,最简单直接的方法是:首先定位到出问题的位置,然后用暴力方式把这个变量打印出来!
打印分两种:①%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] 12015-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] 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