Foundation框架-08 集合对象的内存管理

原创 2015年07月10日 23:27:28

Foundation框架-08 集合对象的内存管理


1.操作集合对象对引用计数器的影响(非ARC模式下)

  • 官方内存管理原则

    • 当调用alloc、new、copy(mutableCopy)方法产生一个新的对象时,就必须在最后调用一次release或者autorelease
    • 当调用retain方法让对象的计数器+1,就必须在最后调用一次release或者autorelease
  • 集合对象的内存管理细节

    • 1> 当把一个对象添加到集合中时,这个对象会做了一次retain操作,计数器会+1
    • 当一个集合被销毁时,会对集合里面的所有对象做一次release操作,计数器会-1
    • 当一个对象从集合中移除时,这个对象会一次release操作,计数器会-1
  • 普遍规律

    • 如果方法名是add\insert开头,那么被添加的对象,计数器会+1
    • 如果方法名是remove\delete开头,那么被移除的对象,计数器-1

2.copy属性

  • 基本概念,copy的意思是拷贝,复制,即利用一个源对象产生一个副本对象

    • 修改源对象的属性和行为,不会影响副本对象
    • 修改副本对象的属性和行为,不会影响源对象
  • copy的使用

    • 一个对象可以调用copy或mutableCopy方法来创建一个副本对象
    • copy:创建的是不可变的副本(如NSString、NSArray、NSDictionary)
    • mutableCopy:创建的是可变副本(如NSMutableString、NSMutableArray、NSMutableDictionary)
  • 使用copy功能的前提

    • copy:需要遵守NSCopying协议,实现copyWithZone:方法,调用copy会自动实现copyWithZone:方法
    • mutableCopy:需要遵守NSMutableCopying协议,实现mutableCopyWithZone:方法
  • 浅复制和深复制

    • 浅复制(浅拷贝,指针拷贝,shallowcopy)
      • 源对象和副本对象是一个对象
      • 源对象(副本对象)引用计数器+1,相当于做了一次retain操作
      • 本质没有产生新的对象
    • 深复制(深拷贝,内容拷贝,deep copy)
      • 源对象和副本对象是不同的两个对象
      • 源对象引用计数器不变,副本对象计数器为1(因为是新产生的)
      • 本质是:产生了新的对象
  • 注意:只有源对象和副本对象都不可变时,才是浅复制,其它都是深复制

  • copy内存管理

    • 浅拷贝,原对象引用计数器+1,必须对原对象进行释放
    • 深拷贝,创建了新对象,必须对新对象释放
  • @property中的copy的作用

    • 防止外界修改内部的值
    • 防止访问对象已经释放
    • 若是用copy修饰block代表将block移到堆内存中,那么一旦在block中访问了某个对象,就会对该对象进行一次retain操作
    • 也可以使用Block_copy(myBlock);将block转移到堆中
    • 注意:
      • block默认存储在栈中,栈中的block对象访问了外界的对象,不会进行retain操作
      • block如果在堆中,一旦block中访问了外界的对象,会对外界的对象进行一次retain操作,防止block在使用对象之前,对象就已经释放,造成内存泄漏
      • 若是在block定义在一个类中,又在程序中访问了对象本身,那么为了避免内存泄漏想,需要将对象修饰为__block
  • 自定义对象实现copy操作

    • 让类遵守NSCopying或NSMutableCopying协议
    • 实现copyWithZone:方法,在该方法中返回一个对象的副本即可
    • 在copyWithZone方法中,创建一个新的对象,并设置该对象的数据与现有对象一致, 并返回该对象
  • 无父类实现
-(id)copyWithZone(NSZone *)zone{
CustomMode *custom = [[[self class]  copyWithZone:zone]  init];
Custom.a = [_a copyWithZone:zone];
Custom.c = _c;//不是对象的 直接赋值
Return custom;
}
  • 有父类实现
    • 不调用父类方法, 无法拷贝父类中继承的属性
    • 不重新调用父类copyWithZone,无法拷贝本来中的特有属性
-(id)copyWithZone(NSZone *)zone{

CustomModel *custom = [super copyWithZone:zone];
….
Return custom;
}

3. @property内存管理策略

  • 非ARC
    • copy : 只用于NSString\block
    • retain : 除NSString\block以外的OC对象
    • assign:基本数据类型、枚举、结构体(非OC对象),当2个对象相互引用,一端用retain,一端用assign
  • ARC
    • copy : 只用于NSString\block
    • strong :除NSString\block以外的OC对象
    • weak:当2个对象相互引用,一端用strong,一端用weak
    • assgin:基本数据类型、枚举、结构体(非OC对象)

Foundation框架解析

字符串(NSString与NSMutableString)创建字符串int main(int argh, char * argv[]) { @autoreleasepool { ...
  • github_33393668
  • github_33393668
  • 2016年02月24日 13:18
  • 615

Core Foundation内存管理

Core Foundation内存管理 发表于 2011 年 11 月 23 日 由 ミ寒寒草 我的理解CoreFoundation是一堆C语言API的集合。内存管理和Objective C感...
  • chuanyituoku
  • chuanyituoku
  • 2013年11月27日 14:02
  • 854

OC系列之Foundation框架

一 Foundation框架介绍 框架是由许多类、方法、函数、文档按照一定的逻辑组织起来的集合。 Foundation框架中的类Foundation框架允许使用一些基本对象,如数字和字符串,以及一些对...
  • ab20514
  • ab20514
  • 2015年10月04日 17:25
  • 642

iOS框架之两个极为重要的框架————Foundation和UIKit的相关内容以及一些其他Cocoa相关内容

Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助。 1、Cocoa是什么? Cocoa是OS X和 iOS操作系统的程序的运行环境。 是什么因素使一个程序成为...
  • Lerryteng
  • Lerryteng
  • 2016年04月21日 11:14
  • 2153

第六章:Foundation框架详解

Foundation框架是Cocoa编程、iOS编程的基础框架,它包括字符串、集合、日期、时间等基础。 本章包括: NSString和NSMutableString 代表日期、时间的N...
  • xiaoxiaobukuang
  • xiaoxiaobukuang
  • 2015年12月24日 17:14
  • 1755

ios_Cocoa框架 “Foundation”和“UIKit”的区别

Cocoa Cocoa不是一种编程语言(它可以运行多种编程语言),它也不是一个开发工具(通过命令行我们仍然可以开发Cocoa程序),它是创建Mac OS X和IOS程序的原生面向对象API,为这...
  • hw_2396611405
  • hw_2396611405
  • 2015年12月05日 11:04
  • 4497

《从零开始学Swift》学习笔记(Day 62)——Core Foundation框架之内存托管对象与非托管对象

原创文章,欢迎转载。转载请注明:关东升的博客  内存托管对象Swift中调用CoreFoundation函数获得对象时候,对象分为:内存托管对象和内存非托管对象。内存托管对象就是由编译器帮助管理内存,...
  • tonny_guan
  • tonny_guan
  • 2016年01月20日 10:19
  • 2167

Foundation框架中的文件和目录

使用NSFileManager管理文件
  • u014084081
  • u014084081
  • 2014年11月05日 22:27
  • 873

黑马程序员---学习笔记24:Foundation框架

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——- Foundation框架 框架是由许多类,方法,函数,文档按照一定的逻辑组织起来的集合,以便...
  • daima_java
  • daima_java
  • 2015年08月20日 13:20
  • 294

响应式WEB界面框架比较-Bootstrap vs. Foundation vs. Skeleton

BootstrapFoundationSkeleton概述用户基数大用户基数中等用户基数中等网格: 流动的和固定的网格: 流动的。在各种视图中是最好的Grid.网格: 固定的UI工具: 很多界面部件;...
  • iefreer
  • iefreer
  • 2013年08月04日 00:22
  • 9839
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Foundation框架-08 集合对象的内存管理
举报原因:
原因补充:

(最多只允许输入30个字)