`
倾城一屁
  • 浏览: 75249 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

浅谈关于nil和 null区别及相关问题

    博客分类:
  • iOS
 
阅读更多
1、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的区别吧。
2、一个可以研究一下的问题
在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,而内存实体不会消失,也不会有系统回收。
分享到:
评论

相关推荐

    lua-cjson decode中null改成nil

    请注意,这样做可能会打破一些期望`nil`的行为,因为在Lua中,`nil`和任何值都不相等,而`"null"`字符串与其他字符串或变量可以进行比较。因此,如果你的代码依赖于`nil`的这种特性,可能会导致意外的结果。在进行...

    IOS 基础之nil,NULL,NSNULL区别详解

    IOS 基础之nil,NULL,NSNULL区别详解 ① nil:一般赋值给空对象。 ② NULL:NULL 是一个通用指针(泛型指针)。 一般赋值给 nil 之外的其他空值。如SEL等。 ③ NSNULL:[NSNull null] 是一个对象,他用在不能使用 ...

    总结IOS中nil、Nil、NULL和NSNull区别

    在Objective-C编程中,了解nil、Nil、NULL和NSNull之间的区别至关重要,因为它们在不同场景下有着不同的用途和含义。下面将逐一详细介绍这些概念。 1. **NULL** NULL是C语言中的一个宏,用来表示空指针。在C语言中...

    iOS中nil、Nil、NULL、NSNull详解

    在iOS开发中,我们经常会遇到各种表示空值的符号,如nil、Nil、NULL和NSNull。理解它们的区别和用途是编写清晰、可维护代码的关键。 1. nil nil是Objective-C中的对象空值,主要用于表示id类型或者使用@interface...

    node-no-nil:从对象和数组中删除nil值。 将所有其他nil值转换为null

    将所有其他nil值转换为null。 例子 var noNil = require ( 'no-nil' ) ; var input = [ 1 , undefined ] ; console . log ( noNil ( input ) ) ; // [1]; ##执照 The MIT License (MIT) Copyright (c) 2015 ...

    ios-清理模型中的nil.zip

    标题"ios-清理模型中的nil.zip"所涉及的内容就是关于如何在模型转换过程中有效地处理这些`nil`或`null`值,以避免程序运行时出现异常。 描述中提到的"清理字典转模型后模型中的nil,属性多于字典,服务器返回为null...

    IOS 开发之对象为空的判断(nil、null)详解

    本文将深入探讨两种常见的空值表示——`nil`和`null`,以及如何针对不同类型的对象进行有效的空值判断。 首先,`nil`是Objective-C中的关键字,用于表示指向对象的指针没有指向任何实际的对象,也就是说,这个指针...

    IOS 去null

    在iOS开发中,JSON解析是常见的任务,但处理null值时常常会遇到问题。"IOS 去null"这个主题主要是关于如何优雅地处理JSON解析过程中遇到的null值,以避免程序运行时出现异常。这里我们将深入探讨这个问题,并通过...

    ios-后台返回数据排空(nsnull nil)处理.zip

    在iOS开发中,后台返回的数据排空,即`NSNull`或`nil`值的处理,是一个常见的问题,尤其在与服务器进行数据交互时。服务器返回的数据可能存在缺失或者异常,导致程序在解析过程中可能出现崩溃。本教程将深入探讨如何...

    iOS中json解析出现的null,nil,NSNumber的解决办法

    通过以上方法,可以有效地处理iOS开发中JSON解析时遇到的`null`、`nil`和`NSNumber`问题,确保应用的稳定性和安全性。在实际开发中,选择最适合项目需求的解决方案,并保持代码的可读性和可维护性。

    ios-一个关于数组越界、字典key与value为nil情况下导致的低级错误的线上Crash的避免的仓库.zip

    标题和描述中提到的问题,即“数组越界”、“字典key与value为nil”的情况,是常见的编程错误,可能导致程序崩溃,严重影响用户体验。这个“DYSafeObject”库很可能提供了一些解决方案来预防这些低级错误。 首先,...

    golang nil接口和空接口

    在内部,接口值可以看做包含值和具体类型的元组: (value, type) 接口值保存了一个具体底层类型的具体值。 接口值调用方法时会执行其底层类型的同名方法。 nil接口 即便接口内的具体值为 nil,方法仍然会被 nil 接收...

    javascript中undefined与null的区别

    大多数计算机语言,有且仅有一个表示”无”的值,比如,C语言的NULL,Java语言的null,Python语言的None,Ruby语言的nil。 有点奇怪的是,JavaScript语言居然有两个表示”无”的值:undefined和null。这是为什么? ...

    Null Pointer;

    在IT行业中,"Null Pointer"是一个非常常见的编程概念,尤其在使用C、C++、Java等语言时。...以上就是关于"Null Pointer"和"字体"这两个主题结合后可能涉及的知识点,这些内容对于理解和解决相关编程问题十分关键。

    带电的Solv和Nil黑洞的热电输运系数

    特别是,我们找到了带电Solv和Nil几何层的解决方案。 我们还发现Nil黑洞具有超标度违规。 对于我们所有的解决方案,我们计算相应双场理论的热电直流输运系数。 我们发现没有超标度违规的Solv和Nil黑洞对金属是双重...

    对Golang的nil的理解和认识

    Go文档中说明:nil是预定义的标识符,代表指针,通道,函数,接口,映射或者切片的零值,并不是Go的关键字之一。 还有,nil只能赋值为以上的几个类型,若赋值给基础类型,则会引发panic 2.nil的作用 指针(pointer)...

Global site tag (gtag.js) - Google Analytics