文档章节

【2015-10-19】内存管理---深浅拷贝,autorelease,ARC(自动引用计数)

尘埃眠于光年yr
 尘埃眠于光年yr
发布于 2015/10/19 18:47
字数 943
阅读 60
收藏 2
点赞 0
评论 0

一.复习内存管理中的MRC(手动管理内存)

1.还是遵循谁retain,谁release的原则;

2.遛狗练习的中途换狗问题,在person的.m文件中重写setdog方法

- (void) setDog:(Dog *)dog{

    //DogA 计数器 - 1

    [_dog release];

    //当前溜的DogB

    _dog = dog;

    //DogB 计数器 + 1

    [_dog retain];

}

3.关于retainCount为1,-1,0,无穷大的条件

(1)为1时 是对象计数 当创建对象时或者对象即将释放时为1,即对象计数器最小为1.

(2)为0时 当一个指针的值为空时。

(3)为-1或无穷大时 当一个数据类型被赋值时。

不可变对象通常被称为静态常量,这类对象一般不能用于计数,而可变的对象是可以用来计数的

二.学习了浅拷贝和深拷贝

1.浅拷贝 copy 通常指针对于指针进行拷贝,特点为:通过多个指针指向同一片内存地址。

如  NSString *string = @"123";

    NSString *stringI = [string copy];

这时string和stringI输出的内存地址相同

2.深拷贝 mutableCopy 指的是赋值内容并且重新创建一块内存地址

如  NSString *stringII = [string mutableCopy];

这时string和stringII输出的内存地址不相同

三.自动释放池(autorelease)

1.autorelease通常有作用域,当在作用域范围内的创建特定的对象时,出去作用域计数器就会-1

如 @autorelease{

    Person *personP = [[Person alloc]autorelease];

//特定的autorelease创建的对象才在出去作用域的时候release 计数器 -1

此时也可以在作用域里面对person retain或release,但是不管怎样,出作用域时计数器只会减y一

}

四.ARC(自动引用计数)

1.ARC会追踪你的对象并决定哪一个仍会使用而哪一个不 会再用到  

• 如果启用了ARC,编译器会自动插入retain和release 语句  

• 通过Xcode启用或禁用可

2.ARC的特点

(1)不允许调用release,retain,retainCount    

(2)允许重写dealloc,但是不允许调用[super dealloc]  

(3)@property的参数:  

  • strong:相当于原来的retain(适用于OC对象),成员变量是强指针  

  • weak:相当于原来的assign,(适用于OC对象类型),成员变量是弱指针  

  • assign:适用于非OC对象类型(基础类型)

相互引用时注意的问题:

1.在一方的.h文件中要导入另一方的头文件,另一方的.h文件要引用@class name

如  #import <Foundation/Foundation.h>

   #import "MicroBlog.h"

   @interface Person : NSObject

   #import <Foundation/Foundation.h>

   @class Person;

   @interface MicroBlog : NSObject

2.一方使用强指针,另一方使用弱指针

3.引用@class的一方若要在.m文件中实现相应的方法,要在.m文件中再次导入另一方的头文件

如  #import "MicroBlog.h"

   #import "Person.h"

   @implementation MicroBlog


ARC实例:

person.h

#import <Foundation/Foundation.h>

#import "MicroBlog.h"


@interface Person : NSObject

@property (nonatomic ,strong)MicroBlog *microBlog;

@property (nonatomic,strong) NSString *name;

@property (nonatomic,weak) NSString *comment;

-(void)printf;

@end


person.m

#import "Person.h"


@implementation Person

-(void)printf

{

    NSLog(@"%@%@发布了第%i条微博,内容是:%@",_name, [_microBlog time],[_microBlog second],[_microBlog content]);

}

@end


microBlog.h


#import <Foundation/Foundation.h>

@class Person;


@interface MicroBlog : NSObject

@property(nonatomic,weak) Person *person;

@property(nonatomic,weak) Person *commentPerson;

@property(nonatomic,weak) NSString *content;

@property(nonatomic,weak) NSString *time;

@property(nonatomic,assign) int second;


-(void)printComment;

@end


microBlog.m

#import "MicroBlog.h"

#import "Person.h"


@implementation MicroBlog

-(void)printComment

{

    NSLog(@"%@评论了你的微博:%@",[_commentPerson name],[_commentPerson comment]);

}

@end


main.m

#import <Foundation/Foundation.h>

#import "MicroBlog.h"

#import "Person.h"


int main(int argc, const char * argv[]) {

    

    Person *person = [[Person alloc]init];

    person.name = @"小明";

    Person *personI = [[Person alloc]init];

    personI.name = @"小花";

    personI.comment = @"👍";

    

    MicroBlog *microBlog = [[MicroBlog alloc]init];

    

    microBlog.content = @"暑假去旅游";

    

    microBlog.second = 2;

    

    NSDate *date = [NSDate date];

    NSDateFormatter *dateformatter = [[NSDateFormatter alloc]init];

    [dateformatter setDateFormat:@"yyyy-MM-dd HH-mm-ss"];

    NSString *nowTime = [dateformatter stringFromDate:date];

    microBlog.time = nowTime;

    

    microBlog.commentPerson = personI;


   //这是容易忘记的一步,要给person对象设置microBlog

    person.microBlog = microBlog;

    

    [person printf];

    [microBlog printComment];

    

 return 0;

}



© 著作权归作者所有

共有 人打赏支持
尘埃眠于光年yr
粉丝 0
博文 15
码字总数 13635
作品 0
西安
OC内存管理常见的面试题

#####面试:说一说对内存管理的理解?(原理) - 手动内存管理(MRC):1.在创建一个对象的时候系统会自动创建这个对象的引用计数并赋值为1;2.当引用计数为0的时候,对象会去调用dealloc方法来...

鹿微微鹿
2016/03/25
275
0
objective-c启用ARC时的内存管理

PDF版下载:http://download.csdn.net/detail/cuibo1123/7443125 在objective-c中,内存的引用计数一直是一个让人比较头疼的问题。尤其是当引用计数涉及到arc、blocks等等的时候。似乎ARC的出...

cuibo1123
2014/06/04
0
0
oc的内存管理机制.及自动释放池的解析

一.内存管理的方式 MRC 人工引用计数:内存的开辟和释放由程序代码无师自通控制,() ARC 自动引用计数(不是自动内存管理)(编译器帮助程序员默认加了释放代码) 在C中使用malloc和free oc中内存管...

Dolion-Hou
2016/03/20
127
0
Objective-C高级编程之引用计数,看我就够了

自动引用计数.png 1.1 什么是自动引用计数 概念:在 LLVM 编译器中设置 ARC(Automaitc Reference Counting) 为有效状态,就无需再次键入 或 代码。 1.2 内存管理 / 引用计数 1.2.1 概要 引用...

shenglanya
2017/12/19
0
0
Objective-C高级编程之内存管理篇

iOS的内存管理是采用引用计数的方式,引用计数分为手动引用计数和自动引用计数(ARC)。前者要求开发者手动管理内存,自己负责内存的申请与释放,后者是苹果推出的自动管理内存的方式,但其实...

还是不够辣
2017/02/24
0
0
《从零开始学Swift》学习笔记(Day 61)——Core Foundation框架之内存管理

原创文章,欢迎转载。转载请注明:关东升的博客 在Swift原生数据类型、Foundation框架数据类型和Core Foundation框架数据类型之间转换过程中,虽然是大部分是可以零开销桥接,零开销并不意味...

智捷课堂
2016/01/18
31
0
iOS经典面试题总结--内存管理

我根据自己的情况做了一下总结,答案是我总结的,如有答的不好的地方,希望批评指正以及交流,谢谢! 内存管理 1.什么是ARC? ARC是automatic reference counting自动引用计数,在程序编译时...

刘星石
2016/03/04
20
0
各个线程 Autorelease 对象的内存管理

最近和 bestswifter 、kuailejim 搞了一套模拟面试,然后不管是应届生还是工作两三年的高级工程师都对下面这几个问题比较懵逼,可能是开发中用到的不多,在这里浅浅的讨论下 Autoreleasepoo...

Joy_xx
2017/11/15
0
0
了解Xcode 4.2中Automatic Reference Counting(ARC)

了解Xcode 4.2中Automatic Reference Counting(ARC) 我要评论(1) 字号:T | T 本文介绍的是来了解Xcode 4.2中Automatic Reference Counting特性和使用方法,详细的介绍了ARC的特性,来看详...

晨曦之光
2012/05/28
105
0
iOS关键字strong/weak/assign/retain/nonatomic/atomic

老了就是老了,不承认不行啊,看个东西总也记不住。只能反反复复的看看。 依旧本着尊重原创和劳动者的原则,将地址先贴在前面: http://www.cnblogs.com/nonato/archive/2013/11/28/3447162...

sea_god
2014/05/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

MyBatis入门

一、安装 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version></dependency> 二、从 XML 中构建 SqlSessionFactory String r......

一个yuanbeth
2分钟前
0
0
聊聊spring cloud的LoadBalancerAutoConfiguration

序 本文主要研究一下spring cloud的LoadBalancerAutoConfiguration RibbonAutoConfiguration spring-cloud-netflix-ribbon-2.0.0.RC2-sources.jar!/org/springframework/cloud/netflix/ribb......

go4it
5分钟前
0
0
【转】使用Lombok来优雅的编码

前言 Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注解实现这一目的。 正文 添加依赖 在 pom.xml 文件中添加相关依赖:...

HAVENT
7分钟前
0
0
Dubbo 源码解读 —— 可支持序列化及自定义扩展

一、概述 从源码中,我们可以看出来。目前,Dubbo 内部提供了 5 种序列化的方式,分别为 fastjson、Hessian2、Kryo、fst 及 Java原生支持的方式 。 针对不同的序列化方式,对比内容如下: 名...

Ryan-瑞恩
15分钟前
0
0
MySQL内存设置—— MySQL server has gone away

set global max_allowed_packet=268435456

一梦心草
24分钟前
0
0
推导式

列表、集合和字典推导式 列表推导式是Python最受喜爱的特性之一。它允许用户方便的从一个集合过滤元素,形成列表,在传递参数的过程中还可以修改元素。形式如下: [expr for val in collect...

火力全開
29分钟前
0
0
maven配置文件settings.xml详解

settings.xml有什么用? 如果在Eclipse中使用过Maven插件,想必会有这个经验:配置settings.xml文件的路径。 settings.xml文件是干什么的,为什么要配置它呢? 从settings.xml的文件名就可以...

浮躁的码农
34分钟前
0
0
MakeCode图形化编程语言学习笔记:micro:bit编程练习题[图]

MakeCode图形化编程语言学习笔记:micro:bit编程练习题[图]: 基础训练题: Q1:摇晃micro:bit编程板,随机出现7个小动物图标中的一个,并且前后相邻两次出现的小动物不重复。 注:七个小动物...

原创小博客
34分钟前
0
0
Redis 压力测试说明

Redis 压力测试说明 redis压力测试 2014-03-24 21:41:07| 分类: 默认分类 | 标签:redis |举报|字号 订阅 这几天对比测试mongodb、redis、pg的性能,主要是在消息队列、消息处理、用户经纬度...

舒文joven
34分钟前
0
0
拉姆达表达式 追加 条件判断 Expression>

public static class PredicateBuilder {   /// <summary>   /// 机关函数应用True时:单个AND有效,多个AND有效;单个OR无效,多个OR无效;混应时写在AND后的OR有效   /// </summary...

Lytf
47分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部