文档章节

深浅拷贝 ARC

 蒲公英6_6守候
发布于 2015/11/08 13:54
字数 954
阅读 2
收藏 0

//释放PersonA 对象 那么我需要先把DogB release,然后在释放

[personA release];
//清空指针
personA = nil;

//------  关于retainCount为1 、 -1 、 0 、 无穷大的条件
//1:为对象计数,当创建对象时或者对象即将释放时为1,即对象计数器最小为1
   Person *personC = [[Person alloc]init];
   NSLog(@"personC retainCount: %lu", [personC retainCount]);
   [personC release];
//0: 当一个指针为空指针的清空下,这个计数器为0
   Person *personD = nil;
   NSLog(@"personD retainCount: %lu", [personD retainCount]);
//无穷大: 当一个数据类型被赋值时,它的retainCount为无穷大
   NSString *string = "123";
   NSLog(
"string retainCount: %lu", [string retainCount]);
//不可变的对象,通过被称为静态常量,这类对象一般不能用于计数,通过会有数据异常的情况,或无穷大或-1,一般可变的对象,通过是可以用来计数的吧。
   NSString *stringA = [[NSString alloc]init];
   [stringA retain];
   NSMutableString *stringB = [[NSMutableString alloc]init];
[stringB retain];
   NSLog(@"stringA retainCount: %lu, stringB retainCount: %lu",[stringA retainCount], [stringB retainCount]);
// 深拷贝 与 浅拷贝
   // 涉及到关键词与相关的知识:1、copy 2、mutableCopy 3、retain  4、 =
   // 浅拷贝:通常指x针对于指针进行拷贝,特点为:通过多个指针指向同一片内存地址

NSArray *day = ["Monday","Tuesday","Wednesday",
"Thursday","Friday","Saturday","Sunday"];
for (int i = 0; i<=[day count]; i++) {
NSLog("% ",day);//0x100102cf0
}
NSString *da = [day copy];
NSLog("%p",day);// 0x100200b50
NSLog(
"%@",[da retainCount] );

NSString *daI = [day mutableCopy];
       NSLog("%p",day);//0x100106b80
       NSLog(
"%@",[daI retainCount]);
NSString *daI = [day mutableCopy];
       NSLog("%p",day);//0x100106b80
       NSLog(
"%@",daI);
//深拷贝:所谓的深拷贝也就是赋值内容并且重新创建一块内存地址
   NSString *stringG = [stringC mutableCopy];
   [stringG retain];
   NSLog("stringD mem: %p, stringG mem: %p ", stringD, stringG);
   NSLog(
"stringC retainCount: %lu, stringG retainCount: %lu", [stringC retainCount], [stringG retainCount]);
//-------- autoreleasePool 自动释放池(半自动释放)
//一般autoreleasepool之所以称之为半自动因为自动释放池通常有作用域,当在作用域范围内的特定(指半自动对象)的对象时,出去作用域才会计数器-1
//作用域
   autoreleasepool {
       //不叫特定的对象,因为没有什么特别
       Person *personQ = [[Person alloc]init];
       personQ.name =
"wangJiang";
//特定的对象,告诉作用域可以在出去的时候release一次
       Person *personP = [[Person alloc]autorelease];
       personP.name = @"daXiong";
   }//特定的autorelease创建的对象才在出去的作用域的适合release 计数器 -1

下面有我写的一个微博
main.m
#import <Foundation/Foundation.h>
#import "Microblog.h" 
#import "Person.h" 
int main(int argc, const char * argv[]) {
//创建个Person的对象
Person *xiaobai = [[Person alloc]init];
//Person属性里面有人名字
[xiaobai setName:"小白"];
//创建微博的对象
Microblog *weibo = [[Microblog alloc]init];
//微博的标题
[weibo setTitle:
"今天是个好日子!"];
[weibo setPerson:xiaobai];
//微博内容
[weibo setContent:@"怎样才可以让你的家看起来更潮?不仅要做足表面功夫,连细节都不要放过哦!咦?谁的鞋子落在门口了?拿起来一看,啊~假的呀!这是什么东东。用来挡门的东东。时髦吧!不过,丈夫们在使用的时候千万要事先跟老婆打的招呼哦!不然当妻子回到家时发现门口有个高跟鞋还不是自己的,那么悲剧就发生了……"];

NSDate *time = [NSDate date];
   NSDateFormatter *timeI =[[NSDateFormatter alloc]init];
   [timeI setDateFormat:@"yyyy年MM月dd日 HH:mm:ss"];
   NSString *timaII = [timeI stringFromDate:time];
   [weibo setTime:timaII];
   xiaobai.microblog = weibo;
   //打印微博全部信息
   [xiaobai printf];

Microblog.h

#import <Foundation/Foundation.h>
#import "Person.h" 
@class Person;//相互引用时才会使用@class ,注意:使用@class时person类不以文件形式引入,后面基的加分号;

//ARC 当中,@property里的参数默认为Strong
@interface Microblog : NSObject
@property(nonatomic,strong)NSString *title;
@property(nonatomic,strong)NSString *time;
@property(nonatomic,strong)NSString *content;
@property(nonatomic,assign)Person *person;//相互引用时一方strong,另一方必定weak
@end

Person.h

#import <Foundation/Foundation.h>
@class Microblog;
@interface Person : NSObject
@property(nonatomic,strong)NSString *name;
@property(nonatomic,weak)Microblog *microblog;
-(void)printf;
@end

Person.m

#import "Person.h" 
#import "Microblog.h" 
implementation Person
-(void)printf{
NSLog(
"%在%\n发布了一个标题为: %\n微博内容为: %",_name,[_microblog time],[_microblog title],[_microblog content]);
}

@end

编辑 跟踪 复制 删除


© 著作权归作者所有

上一篇: ARC MRC 混编
下一篇: 内存管理机制
粉丝 0
博文 15
码字总数 7681
作品 0
西安
私信 提问
【2015-10-19】内存管理---深浅拷贝,autorelease,ARC(自动引用计数)

一.复习内存管理中的MRC(手动管理内存) 1.还是遵循谁retain,谁release的原则; 2.遛狗练习的中途换狗问题,在person的.m文件中重写setdog方法 - (void) setDog:(Dog )dog{ //DogA 计数器 - ...

尘埃眠于光年yr
2015/10/19
64
0
python笔记--深浅拷贝

深浅拷贝 1.对于数字、字符串和元组而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址,例如: >>> n1=123>>> import copy>>> n2=n1 #赋值>>> print(id(n2))31427456>>> prin......

FJCA
2017/05/19
0
0
Python 的深浅拷贝 终于明白了

python 深浅拷贝不之前一直不太理解,只是概念性的理解像 1,2 所说,敲完下面代码希望你可以理解。 1、copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。 2. copy.deepcopy 深拷...

水滴石川1
2018/06/26
0
0
python 深浅拷贝 属性获取,垃圾回收

说下对python深浅拷贝的理解。并有代码简单实现 浅拷贝:浅拷贝是对于一个对象的顶层拷贝,拷贝了引用,并没有拷贝内容 深拷贝:深拷贝是对于一个对象所有层次的拷贝(递归) 只有一层深浅拷贝...

盛夏光年_49e9
2017/11/22
0
0
python学习系列--深拷贝和浅拷贝

概念 普通情况下,复制一个对象是不会新开辟内存空间的,只是把新的对象名称指向原有的内存地址,这种操作其实不是算是拷贝,只是新的引用。把新的对象置于新的内存空间中,才是拷贝。在pyt...

拾瓦兴阁
2017/07/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

LeetCode 第 287 号问题:寻找重复数,一道非常简单的数组遍历题,加上四个条件后感觉无从下手

今天分享的题目来源于 LeetCode 第 287 号问题:寻找重复数。 题目描述 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只...

五分钟学算法
35分钟前
3
0
vuex mapActions

本文转载于:专业的前端网站➧vuex mapActions 在组件中使用 this.$store.dispatch('xxx') 分发 action,或者使用 mapActions 辅助函数将组件的 methods 映射为 store.dispatch 调用(需要先在...

前端老手
36分钟前
3
0
使用bash -x 调试信息查看lvextend -r的调用

--1.打开调试: [root@db01 storage]# set -x --2.执行命令: [root@db01 storage]# /usr/sbin/lvextend -r -L 710M /dev/shazam/storage + /usr/sbin/lvextend -r -L 710M /dev/shazam/sto......

突突突酱
45分钟前
3
0
Linux重定向及反弹shell详解

这里说Linux重定向的原因主要还是为了详细了解一下Linux中的反弹shell 目录 0x01 文件描述符 0x02 重定向 0x03 反弹shell 0x04 交互重定向 0x05 命令变形 0x01 文件描述符 Linux的文件描述符...

无心的梦呓
50分钟前
3
0
开发经验 初学51单片机建议用C语言

typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   新手学习51单片机建议用C语言。因为使用C语言入门的话,上手速度快。实现几个例程后...

志成就
56分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部