第二天(内存管理)

01-autorelease基本概念

Person.m

 1 #import "Person.h"
 2
 3 @implementation Person
 4
 5 - (void)dealloc
 6 {
 7     [super dealloc];
 8     NSLog(@"Person 被销毁了");
 9 }
10
11 @end

Person.m

Person.h

1 #import <Foundation/Foundation.h>
2
3 @interface Person : NSObject
4
5 @end

person.h

main.m

  1 //内存管理原则(配对原则):只要出现了new,alloc,retain方法,就要配对出现release,autorelease
  2 //对象存入到自动释放池中,当这个池子被销毁的时候他会对池子中所有的对象进行一次release操作
  3 //怎么把对象存到池子中
  4 #import <Foundation/Foundation.h>
  5 #import "Person.h"
  6
  7 int main(int argc, const char * argv[])
  8 {
  9     /* 示例1
 10     //自动释放池
 11     //大括号代表池子的作用域
 12     @autoreleasepool
 13     {
 14
 15      //release 功能 retaincount - 1
 16      //autorelease 好像功能也是 retaincount - 1 ?
 17         //1
 18         Person * p = [[Person alloc] init];
 19 //        [p release];//retainCount立即 -1
 20         [p autorelease]; //autorelease方法的作用只是将对象放入到池子中,然后返回一个self
 21
 22         NSLog(@"asdfasdf");
 23
 24      }//代表,池子将要被销毁,对池子中所有的对象进行一次release操作,[p release] 0
 25      */
 26
 27     /*
 28     //autoreleasepool我么可以自己随意的创建
 29
 30     // 示例2
 31     //1//不管你这个对象时在@autoreleasepool 之内创建的还是在之外创建的,只要你在池子中调用了autorelease那么这个对象就会被放入到池子中
 32     Person * p = [[Person alloc ] init];
 33
 34     @autoreleasepool {
 35
 36         [p autorelease];
 37
 38     }//p 0
 39     */
 40     // 示例3
 41     /*
 42     //1 只有在自动释放池的作用域中调用对象的autorelease方法才能够正确的讲对象放入到池子中
 43     Person * p = [[Person alloc] init];
 44     [p autorelease];
 45
 46     NSLog(@"aaaa");
 47     @autoreleasepool {
 48
 49     }
 50     NSLog(@"bbb");
 51      */
 52     //示例4
 53     /*
 54     // 1
 55     Person *  p = [[Person alloc] init];
 56
 57     @autoreleasepool {
 58
 59         [p autorelease];//加入第一次
 60
 61         [p autorelease];//加入第二次
 62
 63         NSLog(@"abc");
 64     }//[p release]0 [p release]
 65
 66      NSLog(@"cbd");
 67     */
 68
 69     //示例5
 70     /*
 71     //1
 72     Person * p = [[Person alloc] init];
 73
 74     @autoreleasepool {
 75
 76         @autoreleasepool {
 77
 78             [p autorelease];
 79         }//?[p release] 0
 80
 81     }
 82     */
 83
 84
 85     Person * p = [[Person alloc] init];
 86
 87     @autoreleasepool {
 88
 89         [p autorelease];
 90
 91         @autoreleasepool {
 92
 93
 94             [p autorelease];
 95         }//[p release] 0
 96
 97
 98     }//[p release];
 99
100
101     return 0;
102 }

main.m

02-autorelease应用

Chief.m

 1 #import "Chief.h"
 2
 3 @implementation Chief
 4
 5 - (void)dealloc
 6 {
 7     [super dealloc];
 8     NSLog(@"厨师被回收了");
 9 }
10
11 + (Chief *)chief
12 {
13     /*
14     Chief * chi = nil;
15
16     chi = [[Chief alloc] init];
17
18 //    [chi release];
19     [chi autorelease];
20     */
21
22     Chief * chi = [[self alloc] init];
23
24
25     return [chi autorelease];
26 }
27 - (Food *)chiefMakeFood
28 {
29
30
31     //如果在方法中创建一个对象,最好给我初始化为nil,防止出现野指针错误
32     // 1
33     Food * food = [[Food alloc] init];
34     food.name = @"凑豆乳";
35 //    // 0
36 //    [food release];
37     [food autorelease];
38
39     return food;
40
41 }
42
43 @end

Chief.m

Chief.h

1 #import <Foundation/Foundation.h>
2 #import "Food.h"
3
4 @interface Chief : NSObject
5
6 + (Chief *)chief;
7 - (Food *)chiefMakeFood;
8
9 @end

Chief.h

Food.m

 1 #import "Food.h"
 2
 3 @implementation Food
 4 - (void)dealloc
 5 {
 6     [super dealloc];
 7     [_name release];
 8     NSLog(@"Food被销毁了");
 9 }
10
11 @end

Food.m

Food.h

1 #import <Foundation/Foundation.h>
2
3 @interface Food : NSObject
4
5 @property(nonatomic,retain) NSString * name;
6
7 @end

Food.h

main.m

 1 #import <Foundation/Foundation.h>
 2 #import "Chief.h"
 3 //autorelease笔试面试出现的几率比[release]
 4
 5 int main(int argc, const char * argv[])
 6 {
 7
 8     @autoreleasepool {
 9
10         /*
11         Chief * chi  = [[Chief alloc] init];
12         Food * food = [chi makeFood];;
13
14
15         NSLog(@"%@",food.name);//[nil name];
16
17         [chi release];
18         */
19
20
21
22         Chief * chi = [Chief chief];
23         Food * food = [chi chiefMakeFood];
24
25         NSLog(@"%@",food.name);
26
27         NSString * name = [NSString stringWithFormat:@"%@",@"施瓦辛格"];//都是autorelease
28
29         NSLog(@"%@",name);
30
31     }
32     return 0;
33 }

main.m

03-ARC机制

Person.m

 1 #import "Person.h"
 2
 3 @implementation Person
 4
 5 - (void)dealloc
 6 {
 7 //    [super dealloc];不能够在调用
 8 //      releae retain 在ARC机制中不能够在去手动调用
 9     NSLog(@"Person 被释放了");
10 }
11
12 @end

Person.m

Person.h

1 #import <Foundation/Foundation.h>
2
3 @interface Person : NSObject
4
5 @end

Person.h

main.m

 1 //ARC简单,不用程序员在去管理内存
 2 //1.强指针 Strong
 3 //2.弱指针 weak
 4
 5 //只要有强指针指向一个对象,那么系统就不会回收该对象
 6 //只要没有强指针指向对象,系统立即回收该对象
 7
 8 //弱指针不影响,对象被回收
 9
10 //默认情况下,所有的指针都是强指针类型
11
12 #import <Foundation/Foundation.h>
13 #import "Person.h"
14
15 void test(Person * v)//Person * v =
16 {
17     v = nil;
18 }//
19
20 int main(int argc, const char * argv[])
21 {
22
23
24
25     /*
26
27     Person * p = [[Person alloc] init];
28
29 //    p = nil;
30
31     Person * p1 = p;
32
33     p = nil;
34    */
35
36
37     Person * p = [[Person alloc] init];
38
39     test(p);
40
41     p = nil;
42
43     NSLog(@"adfasdf");
44     /*
45     //创建出来就会立即被释放掉,应为没有强指针指向该对象
46     __weak Person * p = [[Person alloc] init];
47     NSLog(@"adfadf");
48     */
49
50     /*
51     Person * p = [[Person alloc] init];
52
53     __weak Person * p1 = p;
54
55     p = nil;
56     */
57
58
59
60     return 0;
61 }

main.m

04-ARC机制下组合关系

person.m

 1 #import "Person.h"
 2
 3 @implementation Person
 4
 5 -(void)dealloc
 6 {
 7     NSLog(@"person 被销毁了");
 8 }
 9
10 @end

Person.m

Person.h

 1 #import <Foundation/Foundation.h>
 2 #import "Car.h"
 3
 4 @interface Person : NSObject
 5
 6 //@property(nonatomic,retain)Car * car;
 7 //ARC机制 strong 对象,手动内存管理的retain关键字,(一定能够都是应用在对象类型变量上)
 8 //ARC机制中的 weak 对象手动内存管理的assign关键字,(一定能够都是应用在对象类型变量上)
 9 @property (nonatomic,strong)Car * car;//强直阵类型的对象,会影响对象回收
10 @property (nonatomic,weak)Car * car2;// 弱指针类型的对象,不会影响对象的回收
11 //@property (nonatomic,assign)Car * car3;//造成迷惑,会导致许多程序员搞不清这个变量到底是stong类型的还是weak类型
12
13 @property (nonatomic,strong)NSString * name;
14 @property (nonatomic,strong)NSString * idCard;
15
16 //ARC机制下 基本数据类型的@property参数使用,与手动内存管理完全一致
17 @property (nonatomic,assign)int age;
18
19 @end

Person.h

Car.m

1 #import "Car.h"
2
3 @implementation Car
4 - (void)dealloc
5 {
6     NSLog(@"Car 被销毁了");
7 }
8 @end

Car.m

Car.h

1 #import <Foundation/Foundation.h>
2
3 @interface Car : NSObject
4
5 @end

Car.h

main.m

 1 #import <Foundation/Foundation.h>
 2
 3 int main(int argc, const char * argv[])
 4 {
 5
 6     @autoreleasepool {
 7
 8
 9     }
10     return 0;
11 }

main.m

05-手动内存管理转换成ARC机制

Person.m

1 #import "Person.h"
2
3 @implementation Person
4 - (void)dealloc
5 {
6     NSLog(@"PErson 被销毁了");
7 }
8 @end

Person

Person.h

1 #import <Foundation/Foundation.h>
2
3 @interface Person : NSObject
4
5 @property (nonatomic,strong)NSString * name;
6 @property (nonatomic,strong)NSString * idCard;
7
8 @end

Person.h

main.m

 1 #import <Foundation/Foundation.h>
 2
 3 int main(int argc, const char * argv[])
 4 {
 5
 6     @autoreleasepool {
 7
 8         // insert code here...
 9         NSLog(@"Hello, World!");
10
11     }
12     return 0;
13 }

main.m

06-ARC与非ARC共存

Person.m

 1 #import "Person.h"
 2
 3 @implementation Person
 4 - (void)sendMessageByIphone:(Iphone *)phone
 5 {
 6     [phone sendMessageWithNumber:@"123124321"];
 7 }
 8
 9 - (void)dealloc
10 {
11 //    [super dealloc];
12 }
13 @end

Person

Person.h

1 #import <Foundation/Foundation.h>
2 #import "Iphone.h"
3
4 @interface Person : NSObject
5
6 - (void)sendMessageByIphone:(Iphone *)phone;
7
8 @end

Person.h

Iphone.m

 1 #import "Iphone.h"
 2
 3 @implementation Iphone
 4
 5 - (void)dealloc
 6 {
 7     [super dealloc];
 8     [_name release];
 9     NSLog(@"Iphone 被销毁了");
10 }
11
12
13 - (void)sendMessageWithNumber:(NSString *)number
14 {
15     NSLog(@"发消息给 %@",number);
16 }
17 @end

Iphone.m

Iphone.h

1 #import <Foundation/Foundation.h>
2
3 @interface Iphone : NSObject
4
5 @property (nonatomic,retain)NSString * name;
6
7 - (void)sendMessageWithNumber:(NSString *)number;
8
9 @end

Iphone.h

main.m

 1 #import <Foundation/Foundation.h>
 2 #import "Person.h"
 3
 4 int main(int argc, const char * argv[])
 5 {
 6
 7     @autoreleasepool {
 8
 9
10
11     }
12     return 0;
13 }

main.m

07-模拟第三方程序

Iphone.m

 1 #import "Iphone.h"
 2
 3 @implementation Iphone
 4
 5 - (void)dealloc
 6 {
 7     [super dealloc];
 8     [_name release];
 9     NSLog(@"Iphone 被销毁了");
10 }
11
12
13 - (void)sendMessageWithNumber:(NSString *)number
14 {
15     NSLog(@"发消息给 %@",number);
16 }
17 @end

Iphone.m

Iphone.h

1 #import <Foundation/Foundation.h>
2
3 @interface Iphone : NSObject
4
5 @property (nonatomic,retain)NSString * name;
6
7 - (void)sendMessageWithNumber:(NSString *)number;
8
9 @end

Iphone.h

main.m

 1 #import <Foundation/Foundation.h>
 2
 3 int main(int argc, const char * argv[])
 4 {
 5
 6     @autoreleasepool {
 7
 8         // insert code here...
 9         NSLog(@"Hello, World!");
10
11     }
12     return 0;
13 }

main.m

08-ARC类循环应用问题

Person.m

 1 #import "Person.h"
 2
 3 @implementation Person
 4
 5 -(void)dealloc
 6 {
 7     NSLog(@"Person 被销毁了");
 8 }
 9
10 @end

Person.m

Person.h

1 #import <Foundation/Foundation.h>
2 #import "Car.h"
3
4 @interface Person : NSObject
5
6 @property (nonatomic,strong)Car * car;
7
8 @end

person.h

Car.m

 1 #import "Car.h"
 2 #import "Person.h"
 3
 4 @implementation Car
 5
 6 - (void)dealloc
 7 {
 8     NSLog(@"Car 被销毁了");
 9 }
10
11 @end

Car.m

Car.h

 1 import <Foundation/Foundation.h>
 2 //#import "Person.h"
 3 @class Person;
 4
 5 @interface Car : NSObject
 6
 7 //@property (nonatomic,strong)Person * p;
 8
 9 //当出现类循环应用的时候,只需要把一方面的Strong引用改为weak,并且在.h文件中使用@class 类名的方式,通知.h文件类的存在
10 @property (nonatomic,weak)Person * p;
11
12 @end

Car.h

main.m

 1 #import <Foundation/Foundation.h>
 2 #import "Person.h";
 3
 4 int main(int argc, const char * argv[])
 5 {
 6
 7     @autoreleasepool {
 8
 9         Person * p = [[Person alloc] init];
10
11         Car * car = [[Car alloc] init];
12
13         [p setCar:car];
14
15         [car setP:p];
16
17         p = nil;
18
19         car = nil;
20
21         NSLog(@"agfadsgf");
22     }
23     return 0;
24 }

main.m

时间: 2024-10-06 12:46:18

第二天(内存管理)的相关文章

轻量级操作系统FreeRTOS的内存管理机制(二)

本文由嵌入式企鹅圈原创团队成员朱衡德(Hunter_Zhu)供稿. 上一篇文章中介绍了FreeRTOS多种内存管理机制中最简单的一种:全局声明一个静态数组ucHeap,然后通过指针偏移记录空间的分配情况,在这种内存机制下无法对内存进行释放.同时也介绍了内存操作过程中字节对齐的细节,本篇文章将会对FreeRTOS源码中第二种内存管理机制heap2.c进行讲解,在heap2.c中同样使用一个全局静态数组ucHeap来表示内存,heap2.c内存管理机制较heap1.c而言增加了内存释放的功能,通过使

FreeRTOS高级篇7---FreeRTOS内存管理分析

内存管理对应用程序和操作系统来说都非常重要.现在很多的程序漏洞和运行崩溃都和内存分配使用错误有关.        FreeRTOS操作系统将内核与内存管理分开实现,操作系统内核仅规定了必要的内存管理函数原型,而不关心这些内存管理函数是如何实现的.这样做大有好处,可以增加系统的灵活性:不同的应用场合可以使用不同的内存分配实现,选择对自己更有利的内存管理策略.比如对于安全型的嵌入式系统,通常不允许动态内存分配,那么可以采用非常简单的内存管理策略,一经申请的内存,甚至不允许被释放.在满足设计要求的前提

《python解释器源码剖析》第17章--python的内存管理与垃圾回收

17.0 序 内存管理,对于python这样的动态语言是至关重要的一部分,它在很大程度上决定了python的执行效率,因为在python的运行中会创建和销毁大量的对象,这些都设计内存的管理.同理python还提供了了内存的垃圾回收(GC,garbage collection),将开发者从繁琐的手动维护内存的工作中解放出来.这一章我们就来分析python的GC是如何实现的. 17.1 内存管理架构 在python中内存管理机制是分层次的,我们可以看成有四层,0 1 2 3.在最底层,也就是第0层是

第二十章 内存等空间管理类的实现

                   第二十章   内存等空间管理类的实现      空间.时间对我来说,或许永远是一个迷.即使我曾经深入到原子的最深处,即使人类科学家是自欺欺人,即使我了解到的最深层次的部分真理是正确的:那又能怎样?那都是过去式,在那光明与黑暗一体之地.我的灵魂受伤了:我不得不回到电脑这块充满垃圾的地方修心养性. 或许我的论述方法不好,要完全理解本章是有点难度:你要对简单的空间概念需要一定的理解,即使只是论述1D的线性平面空间中的2个基本方法:分配与释放,但也很复杂.要知道LI

Java内存管理第二篇 - 内存的分配

Java内存管理无非就是对内存进行分配和释放.对于分配来说,基本类型和对象的引用存储到栈中,常量存储到常量池中,对象存储到堆上,这是一般的分配.而对于回收来说要复杂的多,如果回收不好,还可能造成分配出去的内存得不到回收而造成内存泄漏. 这一篇将简单介绍一下Java内存的分配,下一篇将介绍内存的回收及内存泄漏等知识. 1.JVM内存模型 1.程序计数器(Program Counter Register): 程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,可以理解为是

raywenderlich写的关于内存管理,第二篇,关于如何检查内存泄露

原文链接地址:http://www.raywenderlich.com/2696/how-to-debug-memory-leaks-with-xcode-and-instruments-tutorial 著作权声明:本文由http://www.cnblogs.com/andyque翻译,欢迎转载分享.请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢! 教程截图: 作为一名无证程序员,无论你多么精通Objective-C的内存管理,随着时间的推移,你也不可避免的犯内存相关的错误.但通常因为代

linux内核探索之内存管理(二):linux系统中的内存组织--结点、内存域和页帧

本文主要参考<深入linux内核架构>(3.2节)及Linux3.18.3内核源码 概述:本文主要描述了内存管理相关的数据结构:结点pg_data_t.内存域struct zone以及页帧(物理页):struct page ,以及该结构相关的一些基本概念. 1. 概述 内存划分为接点,每个结点关联到系统中的一个处理器,在内核中表示为pg_data_t. 各个结点又划分为内存域,比如DMA内存域,高端内存域,普通内存域. 内核内存域的宏: enum zone_type { #ifdef CONF

IOS内存管理

原文链接:http://blog.csdn.net/weiqubo/article/details/7376189 1.  内总管理原则(引用计数)    IOS的对象都继承于NSObject,   该对象有一个方法:retainCount ,内存引用计数. 引用计数在很多技术都用到: window下的COM组件,多线程的信号量,读写锁,思想都一样.       (一般情况下: 后面会讨论例外情况)    alloc      对象分配后引用计数为1    retain    对象的引用计数+1

(转)从内存管 理、内存泄漏、内存回收探讨C++内存管理

http://www.cr173.com/html/18898_all.html 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对 C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃 C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能