关于nil和 null和NSNull的区别及相关问题
来源:互联网 发布:淘宝卖家在闲鱼卖东西 编辑:程序博客网 时间:2024/05/23 21:08
关于nil和 null和NSNull的区别及相关问题
1、nil和null从字面意思来理解比较简单,nil是一个对象,而NULL是一个值,我的理解为nil是将对象设置为空,而null是将基本类型设置为空的,个人感觉有点像属性当中,基本类型分配为assign NSString类型一般分配copy,而对象一般用retain。而且我们对于nil调用方法,不会产生crash或者抛出异常。
看一段
3、一个可以研究一下的问题
在dealloc中
-(void) dealloc
{
self.test = nil;
[_test release];
test = nil;
}
这几个的区别
先说最简单的 [_test release]; 这个就是将引用技术减1,所谓的引用计数就是看看有多个指针指向一块内存实体,当release一次,就是指针减少一个,release到了0的时候,就是真正把这块内存归还给系统的时候了
再说self.test = nil;说明一下 属性和setter和getter方法就不难理解了
-(void) setTest:(NSString *)newString
{
if(_test != newString)
[_test release];
_test = [newString retain];
}
-(NSString *)test
{
return _test;
}
这个是setter和getter方法,而在这个问题中相当于刚才的代码改变为
if(_test != nil)
[_test release];
_test = nil;
现在就比较容易解释了,setter方法会retain nil对象,在这之前已经先release了旧的对象,这个方法优点是成员变量连指向随机数据的机会都没有,而通过别的方式,就可能会出现指向随机数据的情况。当release了之后,万一有别的方法要用要存取它,如果它已经dealloc了,可能就会crash,而指向nil之后,就不会发生错误了。nil说白了就是计数器为0,这么说吧,当真正release一个对象的时候,NSLog是打印不了它指向的内存控件的,而当nil的时候,是可以打印出来指向的一个内存空间。
那么现在也不难解释test = nil; 单纯的这种用法可以说是自己给自己制造内存泄露,这里可以这么理解,就是相当于将指向对象的指针直接和对象一刀两断了。直接让test指向nil,而内存实体不会消失,也不会有系统回收。
看一段
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的区别吧。
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:controller];
在dealloc中
-(void) dealloc
{
self.test = nil;
[_test release];
test = nil;
}
这几个的区别
先说最简单的
再说self.test = nil;说明一下 属性和setter和getter方法就不难理解了
-(void) setTest:(NSString *)newString
{
if(_test != newString)
[_test release];
_test = [newString retain];
}
-(NSString *)test
{
return
}
这个是setter和getter方法,而在这个问题中相当于刚才的代码改变为
if(_test != nil)
[_test release];
_test = nil;
现在就比较容易解释了,setter方法会retain nil对象,在这之前已经先release了旧的对象,这个方法优点是成员变量连指向随机数据的机会都没有,而通过别的方式,就可能会出现指向随机数据的情况。当release了之后,万一有别的方法要用要存取它,如果它已经dealloc了,可能就会crash,而指向nil之后,就不会发生错误了。nil说白了就是计数器为0,这么说吧,当真正release一个对象的时候,NSLog是打印不了它指向的内存控件的,而当nil的时候,是可以打印出来指向的一个内存空间。
那么现在也不难解释test = nil;
0 0
- nil Nil null @"" 关于nil和 null和NSNull的区别及相关问题||(null) <null> nil 问题
- nil和 null和NSNull的区别及相关问题
- 关于nil和 null和NSNull的区别及相关问题
- ios学习笔记:关于nil和 null和NSNull的区别及相关问题
- 关于nil和 null和NSNull的区别及相关问题
- 关于nil和 null和NSNull的区别及相关问题
- 关于nil和 null和NSNull的区别及相关问题
- 关于nil和 null和NSNull的区别及相关问题
- nil, Nil, NULL和NSNull的区别
- nil、Nil、NULL和NSNull的区别
- 关于nil和 null和NSNull的区别
- 浅谈关于nil和 null区别及相关问题
- 浅谈关于nil和 null区别及相关问题(转)
- 浅谈关于nil和 null区别及相关问题
- iOS之nil, Nil, NULL,null和NSNull的区别
- NIL、NIL、NULL和NSNULL区别
- nil、Nil、NULL和NSNull区别
- nil、Nil、NULL和NSNull区别
- [转]VS编译duilib项目时候的错误解决方法整理
- 获取自定义Calendar中的数据
- 学习笔记之空指针。 新手。
- CLRS 7.2快速排序的性能
- Mac下和Windows下UnrealEngine 4体验对比
- 关于nil和 null和NSNull的区别及相关问题
- POJ 1035 Spell checker
- arm wifi驱动编译及无线wifi网络管理
- 面向服务与微服务架构
- Note For Linux By Jes(1)-Linux 的文件权限与目录配置
- 正则表达式(三) 表达式助手
- Hdu1233 最小生成树_还是畅通工程
- error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
- 两分钟学会在GitHub托管代码