平时我们使用对象之间的传值都是采用retain count +1的方式,这种方式的适用于当对象的某属性的值改变时,引用该对象的不同指针会同时改变,因为这两个指针指向的是同一个内存地址,
但如果需求是,当一个指针执行的对象属性值发生改变时,不影响另一个对象,那么需要分配两个不同的内存地址,也就是说,我们就不可以采用retain关键字了,而是要采用copy关键字,因为copy关键字会在复制时重新创建一个新的对象。
各种属性定义关键字
strong :除NSString\block以外的OC对象
@property(nonatomic,strong) NSArray *<#model#>;
weak:各种UI控件(但不是绝对,也有控件要使用strong属性的)还有 代理
@property (nonatomic,weak) UIButton *button;
assign:CGFloat,NSInteger等基本数据类型、枚举、结构体(非OC对象)
@property(nonatomic,assign) CGFloat <#model#>;
copy:
copy : 创建的是不可变副本(如NSString、NSArray、NSDictionary)
mutableCopy :创建的是可变副本(如NSMutableString、NSMutableArray、NSMutableDictionary)
@property(nonatomic,copy)NSString *<#model#>;
是单层深拷贝
在非集合类对象中:对immutable对象进行copy *** 作,是指针复制,mutableCopy *** 作时内容复制;对mutable对象进行copy和mutableCopy都是 内容复制。用代码简单表示如下:
[immutableObject copy] // 浅复制
[immutableObject mutableCopy] //深复制
[mutableObject copy] //深复制
[mutableObject mutableCopy] //深复制
31. 堆 栈 静态区可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。
静态存储区(全局存储区):内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。
栈区:内存管理由系统控制,存储的为非静态的局部变量,例如:函数参数,在函数中生命的对象的指针等。当系统的栈区大小不够分配时, 系统会提示栈溢出。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
堆区:亦称动态内存分配。内存管理由程序控制,存储的为malloc , new ,alloc出来的对象。
如果程序没有控制释放,那么在程序结束时,由系统释放。但在程序运行过程中,会出现内存泄露、内存溢出问题。
分配方式 类似于链表。
有时希望函数中的局部变量的值在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放,在下一次再调用的时候该变量已经有值。这时就应该指定该局部变量为静态变量,用关键字 static 进行声明。
33. ios沙盒机制 什么是沙盒? IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒保存内容所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等作用
iOS沙盒为程序运行提供了很好的安全保障
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)