美文网首页iOS面试专题
iOS中assign可不可以修饰对象

iOS中assign可不可以修饰对象

作者: 三岁就很乖 | 来源:发表于2021-02-01 09:41 被阅读0次

    assign修饰对象类型会怎样?
    首先我们需要明确,对象的内存一般被分配到堆上,基本数据类型和oc数据类型一般被分配在栈上。
    如果用assign修饰对象,当对象释放后(因为不存在强引用,离开作用域对象内存可能被回收),指针的地址还是存在的,也就是说指针并没有被置为nil,下次再访问该对象就会造成野指针异常。对象是分配在堆上的,堆上的内存由程序员手动释放。
    assign修饰基本数据类型或OC数据类型,因为基本数据类型是分配在栈上的,由系统分配和释放,所以不会造成野指针。

    ios 基本数据类型有:int、float、double和char类型。1.何为assign?assign 是oc中定义对象属性property时用于修饰基本数据类型和oc数据类型的关键字。2.为什么assign不能用于修饰对象?objective-c 对象所占内存总是分配在“堆空间”,并且堆内存是由你释放的,即release。一般由程序员分配释放,若程序员不释放,则可能会引起内存泄漏。优缺点栈对象优点:1.高速,在栈上分配内存是非常快的。2.简单,栈对象有自己的生命周期,你永远不可能发生内存泄露。因为他总是在超出他的作用域时被自动销毁了缺点:1栈对象严格的定义了生命周期也是其主要的缺点,栈对象的生命周期不适于Objective-C的引用计数内存管理方法。在objective-c中只支持一个类型对象:blocks。关于在block中的对象的生命周期问题。出现这问题的原因是,block是新的对象,当你使用block时候,如果你想对其保持引用,你需要对其进行copy操作,(从栈上copy到堆中,并返回一个指向他的指针),而不是对其进行retain操作堆对象优点:可以自己控制对象的生命周期。缺点:需要程序员手动释放,容易造成内存泄漏。首先我们需要明确,对象的内存一般被分配到堆上,基本数据类型和oc数据类型的内存一般被分配在栈上。如果用assign修饰对象,当对象被释放后,指针的地址还是存在的,也就是说指针并没有被置为nil,从而造成了野指针。因为对象是分配在堆上的,堆上的内存由程序员分配释放。而因为指针没有被置为nil,如果后续的内存分配中,刚好分配到了这块内存,就会造成崩溃。而assign修饰基本数据类型或oc数据类型,因为基本数据类型是分配在栈上的,由系统分配和释放,所以不会造成野指针。weak和assign的区别-正确使用weak、assign
    一、区别
    1.修饰变量类型的区别weak只可以修饰对象。如果修饰基本数据类型,编译器会报错-“Property with ‘weak’ attribute must be of object type”。assign可修饰对象,和基本数据类型。当需要修饰对象类型时,MRC时代使用unsafe_unretained。当然,unsafe_unretained也可能产生野指针,所以它名字是"unsafe_”。
    2.是否产生野指针的区别weak不会产生野指针问题。因为weak修饰的对象释放后(引用计数器值为0),指针会自动被置nil,之后再向该对象发消息也不会崩溃。 weak是安全的。assign如果修饰对象,会产生野指针问题;如果修饰基本数据类型则是安全的。修饰的对象释放后,指针不会自动被置空,此时向对象发消息会崩溃。二、相似都可以修饰对象类型,但是assign修饰对象会存在问题。三、总结assign适用于基本数据类型如int,float,struct等值类型,不适用于修饰对象(会产生野指指针)。weak适用于delegate和block等引用类型,不会导致野指针问题,也不会循环引用,非常安全。

    相关文章

      网友评论

        本文标题:iOS中assign可不可以修饰对象

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