美文网首页
未初始化局部变量跨ARC使用引发的崩溃

未初始化局部变量跨ARC使用引发的崩溃

作者: 偶是星爷 | 来源:发表于2016-02-16 09:18 被阅读48次

遇到一次函数调用,在还未进入函数内部就Crash,原因为EXEC_BAD_ACCESS。最后分析的结果是:一个位于非arc的未初始化的局部变量,传给了一个在arc的函数用做参数,结果这个arc函数访问了一个非法地址。

说起来有点拗口,给一段小代码吧。

int main() { 
  NSString *s; 
  if (s) { 
    NSLog(@"WTF"); 
  }
  NSLog(@"%@", s);
}

这段代码在非ARC工程输出"WTF"后崩溃,而arc的工程输出"(null)"。
究其原因,Objective-C遵循C89了标准:只对全局和静态变量做初始化,局部变量undefined。所以上面的s其实是一个野指针。如果把这个指针传给一个arc的函数,编译器会在进入函数之前,对其retain,结果当然是崩溃了。

而ARC,栈上的OC指针默认初始化nil。
Transitioning to ARC Release Notes: Stack Variables Are Initialized with nil

所以,在这里鼓励大家使用ARC。除了方便内存管理,还可以减少很多bug。

相关文章

  • 未初始化局部变量跨ARC使用引发的崩溃

    遇到一次函数调用,在还未进入函数内部就Crash,原因为EXEC_BAD_ACCESS。最后分析的结果是:一个位于...

  • Java日常积累

    1. 类的成员变量默认初始化,局部变量默认不会初始化,未初始化使用编译不通过;未初始化和null有区别。

  • 使用ARC时的一些注意事项

    1.ARC空声明变量 使用ARC的另一个优势是所有未初始化的变量默认都是“空值化”的。这意味着像下面这样的声明使用...

  • 在ARC机制下直接操作内存崩溃

    问题: 在ARC机制下使用ARC管理机制外的函数操作内存,程序直接崩溃,物错误提示 解决方案: PS:

  • php7 源码分析-准备(static)

    static 静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变...

  • 快速理解关键词static、const、extern和用处

    static和const的使用 static 修饰局部变量作用:让局部变量只初始化一次局部变量在程序中只有一份内存...

  • java数据结构

    变量 局部变量:在栈上分配的,局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用. 实例变量具有...

  • JAVA笔记(菜鸟教程)

    1.局部变量是在栈上分配的。 2.局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。 3.类变...

  • 约束问题

    1 定义一个局部变量的约束 首先 因为局部变量对象 初始化时不会主动置为nil 2 使用网络获取推啊广告的开关 因...

  • Go-Think

    1.元组赋值 2. 未使用的变量以及包编译报错 Go中定义了未使用的局部变量或者导入了未使用的包,编译时都会报错 ...

网友评论

      本文标题:未初始化局部变量跨ARC使用引发的崩溃

      本文链接:https://www.haomeiwen.com/subject/gzmpkttx.html