属性修饰符

    xiaoxiao2023-03-16  5

    属性是Objective-C 2.0 引入的,提供了一种轻松地为类声明实例变量的方法,并让编译器自动生成存取方法。另外,属性还提供了一种通过限定符声明所有权的方式(无论是否使用ARC),编译器将根据指定的限定符生成正确的代码。

    1.声明属性

    属性是在类的接口中声明的。属性可在头文件(.h)中声明,这样的属性在外部可见;也可以在(.m)文件中声明,这样的属性只在当前的类的实例中可见。 编译器将根据指定的限定修饰符(也可称之为特性)创建实例变量和标准的存取方法。 有三种限定符可用于属性修饰。

    //第一种(原子性):nonatomic/atomic(默认)命令编译器加锁,让属性能够同时被多个线程安全的访问,但是系统开销过大。如果不需要这种加锁机制,可使用限定符nonatomic,让编译器不生成加锁代码。在这种情况下,将不能从多个线程安全地访问属性。 //第二种(可写性):readwrite(默认,让编译器为实例变量生成取方法和存方法)/readonly(只生成取方法) //第三种(内存管理,只针对存方法):具体如下 #assign(默认):赋值;有用assign特性的属性,其存方法只会将传入的参数复值给实例变量;一般是非对象属性(基本数据类型,id类型), #retain:存方法会先保留或者复制传入的参数,然后再复制给实例变量; #copy:重新开辟内存空间,防止间接被改变;多用于属性类型是可修改的子类,如NSArray,NSString,block; //下面时iOS5 ARC(编译器特性)时新加的关键字 #strong: 与retain类似,只要有strong指向的内存就不会被释放。 #weak: 当weak指针指向的对象没有强指针指向时,系统自动设为nil,对象被释放。相对于unsafe_unretained是安全的。 #unsafe_unretained: 见文思意 unSafe & unRetained 既不安全也不回引用计数加一。当所指对象没有强指针指向时,会造成野指针错误,造成程序崩溃。 区别:copy retain:

    需要注意的几个问题: -为什么给xib&storyBoard拖拽空间默认是weak?因为xib&storyBoard中的Controller->View->UIView(->表示强饮用);self.view addSubView:这种方法也会是strong效果 -懒加载处理界面空间也要使用strong强指针

    2.合成属性

    3.堆(heap)

    iOS的设备RAM(random access memory)大小有限。内存的存取速度远快于硬盘,所以运行应用时占用的内存(memory)都取自RAM。操作系统(iOS)启动应用时,会为应用保留一部分空闲的RAM,称之为堆(heap)。 其中堆又分 数据段(data segment)和栈(stack)两个部分。应用的可执行文件会保存在数据段中,所有构成方法和函数的指令也保存于此。启动应用后,内存中的这块区域永远不会变。代码会被载入这块内存并且不会被修改。 通过(NSString * str = @"A string";)代码创建的字符串常量时,该字符串的内存也会保存在数据段中,但这里还是会将其当作对象来处理。 栈 是一块为处理函数调用而预留的内存空间(从底层实现看,方法就是函数)。调用函数时,系统会为该函数特别预留一块栈,这块栈称为**栈帧**(stack frame)。栈帧会保存调用方(函数)的地址,以便能够在当前函数结束时,会回到之前的函数。栈帧还会为参数,返回值,局部变量预留内存空间。

    如有不妥之处,万望不吝赐教(QQ:372160694) (未完待续)

    转载请注明原文地址: https://ju.6miu.com/read-1152719.html
    最新回复(0)