Objecitive-C中的nil

当我学习OC的时候,我总是忍不住在对比。Actionscript是如何实现,而oc又是如何实现。这不,碰到nil的时候我发现了很大的不同之处。做个笔记。 

在as中,如果将一个对象置为null,相当于空指针,那么后续对该对象的操作会报错。而在编码中,我们常常会判断if(obj == nul )来判断该对象是否存在,存在的话才可以进行后续操作。 

而在oc中,nil就相当于c、c++中的NULL指针,一般释放对象后将对象置为nil非常重要,这样可以防止引用非法指针导致程序崩溃掉。

1 [obj
release];
//此时obj的引用计数为0
2 [obj
someMethod];
//程序崩溃
3  
4 [obj
release];
5 obj
= nil;
6 [obj
someMethod];
//obj此时为nil,但不会崩溃

在objective-c中我们只用nil来检查程序的逻辑,而不用于判断对象是否为空来避免崩溃。这与c++是不同。objective-c在运行时会自动处理向nil对象发送消息(调用方法),不会报错崩溃掉。

时间: 2024-08-04 03:57:52

Objecitive-C中的nil的相关文章

Ruby处理方法调用中的nil

我们常常处理这样的代码: name=person?person.name:nil 取某个对象的一个属性,先判断对象是否为nil,不是nil就返回对象属性,否则返回nil.这样的代码写多了比较恶心,是否有比较有趣的方式来减少代码?作者给出了一段代码: module ObjectExtension def nil_or return self unless self.nil? o = Object.new class << o def method_missing(sym, *args); nil

Ruby小技巧:处理方法调用中的nil

读blog看到的一个小技巧,原文在这里.     我们常常处理这样的代码: name=person?person.name:nil     取某个对象的一个属性,先判断对象是否为nil,不是nil就返回对象属性,否则返回nil.这样的代码写多了比较恶心,是否有比较有趣的方式来减少代码?作者给出了一段代码: module ObjectExtension  def nil_or   return self unless self.nil?   o = Object.new   class << o

iOS中动态更新补丁策略JSPatch运用基础二

iOS中动态更新补丁策略JSPatch运用基础二 一.引言     上篇博客中介绍了iOS开发中JSPatch引擎进行动态热修复的一些基础功能,其中包括向Objective-C类中添加类方法与成员方法.添加临时成员变量,使用JavaScript调用原生的Objective-C属性和方法等.本篇博客将基于上一篇继续介绍Objective-C中的一些特殊数据类型在JavaScript文件中的使用方法,博客中大部分内容扩展自JSPatch开源git的wiki:https://github.com/ba

iOS中使用JSPatch框架使Objective-C与JavaScript代码交互_IOS

JSPatch是GitHub上一个开源的框架,其可以通过Objective-C的run-time机制动态的使用JavaScript调用与替换项目中的Objective-C属性与方法.其框架小巧,代码简洁,并且通过系统的JavaScriptCore框架与Objective-C进行交互,这使其在安全性和审核风险上都有很强的优势.Git源码地址:https://github.com/bang590/JSPatch. 一.从一个官方的小demo看起 通过cocoapods将JSPath集成进一个Xcod

iOS开发中 常用枚举和常用的一些运算符(易错总结)

1.色值的随机值: #define kColorValue arc4random_uniform(256)/255.0 // arc4random_uniform(256)/255.0; 求出0.0~1.0之间的数字 view.backgroundColor = [UIColor colorWithRed:kColorValue green: kColorValue blue: kColorValue alpha: 0.5]; 2.定时器的使用: [NSTimer scheduledTimerW

iOS中 Realm的学习与使用 韩俊强的博客

iOS开发者交流QQ群:446310206  有问题或技术交流可以咨询!欢迎加入! 这篇直接搬了一份官方文档过来看的 由于之前没用markdown搞的乱七八糟的 所以重新做了一份 后面看到官网的中文文档更新不及时看着英文翻译了一点 搞的更乱了 :( 英文好的直接点右边->官方OC文档 Realm是一个移动端的数据库,Realm是SQLite和CoreData的替代者.它可以节省你成千上万行代码和数周的工作,并且让你精巧的制作出令人惊叹的用户体验. 文档版本 0.93.2在github上获取 需求

Lua中获取table长度的方法_Lua

官方文档是这么描述#的: 取长度操作符写作一元操作 #. 字符串的长度是它的字节数(就是以一个字符一个字节计算的字符串长度). table t 的长度被定义成一个整数下标 n . 它满足 t[n] 不是 nil 而 t[n+1] 为 nil: 此外,如果 t[1] 为 nil ,n 就可能是零. 对于常规的数组,里面从 1 到 n 放着一些非空的值的时候, 它的长度就精确的为 n,即最后一个值的下标. 如果数组有一个"空洞" (就是说,nil 值被夹在非空值之间), 那么 #t 可能是

Lua中的for循环和迭代器的秘密探究_Lua

上一篇我们介绍了,可以使用for循环来完成迭代器的调用,十分简洁. 那么,具体这for循环做了什么呢?我当然没有去看源码,我只是看书而已. 资料来源于<Lua程序设计>第二版,如果这本书的内容没有错的话,那么,本篇文章理论上也不会有错~ 1.返回两个值的迭代器 pairs是能遍历table的key和value的,而我们之前写的dieDaiQi函数只能返回value. 所以,我们要改改dieDaiQi函数,如下: 复制代码 代码如下: function dieDaiQi(t)     local

golang error和nil深入分析

go处理错误的方式非常原始和有效,go是通过function返回error类型而非主流语言抛出异常.在golang里永远不要忽略错误,否则可能导致程序的意外崩溃. 通常用如下方式检测错误: if value, err := pack1.Func1(param1); err != nil {     fmt.Printf("Error %s in pack1.Func1 with parameter %v", err.Error(), param1)     return    // o