IOS基础 Day-1手动内存管理

辞职回家打算自学IOS开发,就在借个地方记录一下

Day-1      手动内存管理                  



主要内容:release  retain必须配对好,不然会占用内存 慢慢积累导致错误

一旦内存占用超过40m 45m时分别发生警告,一旦超过120m 系统将kill你的app 发生闪退

主要要防止发生的问题:

1.野指针操作

2.内存泄漏

理解retain和assign的区别和 retain的原理

Main

  1  //
  2 //  main.m
  3 //  1-1内存管理
  4 //
  5 //  Created by k on 14-8-24.
  6 //  Copyright (c) 2014年 com.akleee.www. All rights reserved.
  7 //
  8
  9 #import <Foundation/Foundation.h>
 10 #import "Person.h"
 11 #import "Car.h"
 12 void withParam(Person *p)
 13 {
 14     [p retain];
 15     NSLog(@"withParam : %@ ,retainCount : %lu",p.myName,(unsigned long)[p retainCount]);
 16     [p release];
 17 }
 18
 19 void test1()
 20 {
 21     Person * p1=[[Person alloc ]init];
 22
 23     NSLog(@"retainCount = %lu", (unsigned long)[p1 retainCount]);
 24
 25
 26     p1.myName=@"haha";
 27
 28     NSLog(@"p1 : %@",p1);
 29
 30     Person * p2 = [p1 retain];
 31
 32     NSLog(@"retainCount = %lu", (unsigned long)[p1 retainCount]);
 33
 34
 35     p2.myName=@"gaga";
 36
 37     NSLog(@"p1 : %@",p1);
 38
 39     NSLog(@"p2 : %@",p2);
 40
 41     withParam(p2);
 42
 43
 44     [p2 release];
 45
 46     [p1 release];
 47
 48     p1=nil;
 49
 50     NSLog(@"%@",p1);//如果p1!=nil 则会发生内存泄露
 51
 52     NSLog(@"%lu", [p1 retainCount]);//nil 但是不报错
 53 }
 54
 55 void test2()
 56 {
 57     Car * c1=[[Car alloc ] init:@"haha"];//初始化 带参数 的对象
 58
 59     NSLog(@"%@",c1);
 60
 61     [c1 release];
 62 }
 63
 64 void test3(){
 65     Person * p1=[[Person alloc]init:@"ak"];
 66
 67     Car * c1= [[Car alloc]init:@"雪弗兰"];
 68
 69     [p1 setCar:c1];
 70
 71     [p1 run];
 72
 73     //1
 74     // NSLog(@"p1 retainCount : %lu", [p1 retainCount]);
 75     //1
 76     //NSLog(@"c1 retainCount : %lu", [c1 retainCount]);
 77
 78       [c1 release];
 79
 80     [p1 release];
 81 }
 82
 83 void test4()
 84 {
 85     //测试property的retain
 86     Person * p1=[[Person alloc]init];
 87
 88     Car * c1=[[Car alloc]init];
 89
 90     Car * c2= [[Car alloc]init];
 91
 92     NSLog(@"c1:%lu",(unsigned long)[c1 retainCount]);
 93
 94
 95     p1.car=c1;
 96
 97
 98     NSLog(@"c1:%lu",(unsigned long)[c1 retainCount]);
 99
100
101     p1.car=c2;
102
103     NSLog(@"c1:%lu",(unsigned long)[c1 retainCount]);
104
105     NSLog(@"c2:%lu",(unsigned long)[c2 retainCount]);
106
107     [c1 release];
108     [c2 release];
109     [p1 release];
110 }
111
112 void test5()
113 {
114     Person * p1=[[Person alloc]init];
115
116     Car * c1=[[Car alloc]init];
117
118     Car * c2= [[Car alloc]init];
119
120     //1
121     NSLog(@"c1:%lu",(unsigned long)[c1 retainCount]);
122     //1
123     NSLog(@"c2:%lu",(unsigned long)[c2 retainCount]);
124
125
126
127     [p1 setCar2:c1];
128
129     //2
130     NSLog(@"c1:%lu",(unsigned long)[c1 retainCount]);
131
132
133     [p1 setCar2:c2];
134
135     //1
136     NSLog(@"c1:%lu",(unsigned long)[c1 retainCount]);
137
138     //2
139     NSLog(@"c2:%lu",(unsigned long)[c2 retainCount]);
140
141
142
143     NSString * s1=@"aaa";
144
145    // NSString * [email protected]"bbb";
146
147     NSLog(@"s1:%lu",(unsigned long)[s1 retainCount]);
148
149     [p1 setMyName:s1];
150
151     NSLog(@"s1:%lu",(unsigned long)[s1 retainCount]);
152
153     [c1 release];
154     [c2 release];
155     [p1 release];
156
157 }
158 int main(int argc, const char * argv[])
159 {
160
161     @autoreleasepool {
162
163        // test1();
164        // test2();
165        // test3();
166         test4();
167         //test5();
168     }
169     return 0;
170 }

Person.h

 1 //
 2 //  Person.h
 3 //  1 基础知识
 4 //
 5 //  Created by k on 14-8-24.
 6 //  Copyright (c) 2014年 com.akleee.www. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10 #import "Car.h"
11
12 @interface Person : NSObject
13 @property (nonatomic,assign , readwrite ) NSString * myName  ;
14 @property (nonatomic,retain,readwrite) Car * car;
15 -(instancetype)init:(NSString *) Name;
16 -(void) speakMyName;
17 -(void)setCar:(Car *) car;
18 -(void) run;
19
20
21
22 -(void)setCar2:(Car*)car2;
23 @end
24   

person.m

 1 //
 2 //  Person.m
 3 //  1 基础知识
 4 //
 5 //  Created by k on 14-8-24.
 6 //  Copyright (c) 2014年 com.akleee.www. All rights reserved.
 7 //
 8
 9 #import "Person.h"
10
11 @implementation Person
12 {
13     Car * _car2;
14 }
15
16 - (instancetype)init:(NSString *) Name
17 {
18     self = [super init];
19     if (self) {
20         _myName=Name;
21     }
22     return self;
23 }
24
25 -(void)speakMyName{
26
27     NSLog(@"大家好我的名字叫%@",_myName);
28
29 }
30
31
32
33 -(void)setCar2:(Car*)car2
34 {
35   if(_car2!=car2)
36   {
37       [_car2 release];
38       _car2=car2;
39       [car2 retain ];
40   }
41 }
42
43 -(void)run{
44
45     NSLog(@"%@ 驾驶着 %@",_myName,_car.carName);
46
47 }
48
49 - (NSString *)description
50 {
51     return [NSString stringWithFormat:@"this is Person,myName=%@", _myName];
52 }
53
54 - (void)dealloc
55 {
56     [_car2 release];
57     [super dealloc];
58     NSLog(@"Person对象被销毁");
59 }
60 @end

Car.h

 1 //
 2 //  Car.h
 3 //  1 基础知识
 4 //
 5 //  Created by k on 14-8-24.
 6 //  Copyright (c) 2014年 com.akleee.www. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10
11 @interface Car : NSObject
12
13 @property (nonatomic,assign,readwrite) NSString * carName;
14 - (instancetype)init:(NSString *)Name;
15
16 -(void)run;
17 @end

Car.m

 1 //
 2 //  Car.m
 3 //  1 基础知识
 4 //
 5 //  Created by k on 14-8-24.
 6 //  Copyright (c) 2014年 com.akleee.www. All rights reserved.
 7 //
 8
 9 #import "Car.h"
10
11 @implementation Car
12
13 - (instancetype)init:(NSString *)Name
14 {
15     self = [super init];
16     if (self) {
17         _carName=Name;
18     }
19     return self;
20 }
21 -(void)run
22 {
23
24     NSLog(@"%@ is Running",_carName);
25 }
26 - (NSString *)description
27 {
28     return [NSString stringWithFormat:@"carName : %@", _carName];
29 }
30 - (void)dealloc
31 {
32     [super dealloc];
33     NSLog(@"Car %@ 被销毁",_carName);
34 }
35 @end

时间: 2024-12-06 22:10:26

IOS基础 Day-1手动内存管理的相关文章

iOS开发OC基础:OC的内存管理

OC内存管理的基础知识 /** //             *  当对一个对象autorelease时,会将该对象放到离它最近的自动释放池,当自动释放池将要销毁时,会对自动释放池中的对象发送release消息,让对象的引用计数减1,(切记,是将对象的引用计数减1,而不是回收空间.) //             */ /** *  如果相对一个对象做copy操作,就必须让该类服从NSCopying协议,并且实现协议中的- (id)copyWithZone:(NSZone *)zone方法 */

黑马程序员---OC基础6【内存管理】【手动内存管理】【单、多个对象的内存管理】【*@property参数】【@class的使用】【NSString类的内存管理】【autorelease使用】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [内存管理] 1.内存管理概念 由于移动设备内存及其有限,所以每个app所占的内存也是有限的 需要回收一些不使用的空间 2.OC内存管理的范围 管理任何继承NSOject的对象,对其他的基本数据类型无效 主要管理堆区中的对象的内存管理   3.内存管理的原理 1)对象所有权概念 任何对象都可以能拥有一个或多个所有者,只要一个对象至少还拥有一个所有者,他就会继续存在 cocoasu所有权策略 任何自

【iOS开发-33】学习手动内存管理临时抛弃ARC以及retain/assign知识——iOSproject师面试必考内容

我们为什么须要内存管理?当使用内存达到40M和45M时候会发出警告,假设不处理,占用内存达到120M时直接强制关闭程序. 所以出现闪退除了是程序出现逻辑错误,还有可能是内存使用过大. (1)创建一个对象的过程:先分配内存空间存储对象:初始化成员变量:返回对象的指针. (2)对象在创建时,内部会自己主动创建一个引用计数器retainCount,当retainCount=0时,系统会回收当前对象,retainCount是唯一推断标记.release会-1.retain会+1,retain后返回的是自

【iOS开发-33】学习手动内存管理暂时抛弃ARC以及retain/assign知识——iOS工程师面试必考内容

我们为什么需要内存管理?当使用内存达到40M和45M时候会发出警告,如果不处理,占用内存达到120M时直接强制关闭程序.所以出现闪退除了是程序出现逻辑错误,还有可能是内存使用过大. (1)创建一个对象的过程:先分配内存空间存储对象:初始化成员变量:返回对象的指针. (2)对象在创建时,内部会自动创建一个引用计数器retainCount,当retainCount=0时,系统会回收当前对象,retainCount是唯一判断标记.release会-1,retain会+1,retain后返回的是自己se

小白学开发(iOS)OC_手动内存管理(2015-08-02)

// //  main.m //  手动内存管理 // //  Created by admin on 15/8/3. //  Copyright (c) 2015年 admin. All rights reserved. // #import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { /* 当我们创建一个对象时: 1. 分配内存空间,存储对象

手动内存管理和自动释放池

手动内存管理 在进行内存管理的时候要注意内存管理的准则:谁开辟内存,谁释放内存(谁污染的谁治理) .开辟内存之后,对象的引用计数为1,只有继承自NSObject的对象才有内促管理的概念, 当对象引用计数为0的时候对象的内存会被清理. 下列关键字会开辟内存,对象引用计数器+1 alloc new copy mutableCopy 下列是内存管理的相关方法. retain :保留对象,对象的引用计数器+1. release : 释放对象,对象引用计数器-1. retainCount : 获取对象当前

iOS-旧项目中手动内存管理(MRC)转ARC

在ARC之前,iOS内存管理无论对资深级还是菜鸟级开发者来说都是一件很头疼的事.我参 加过几个使用手动内存管理的项目,印象最深刻的是一个地图类应用,由于应用本身就非常耗内存,当时为了解决内存泄露问题,每周都安排有人值班用 Instruments挨个跑功能,关键是每次都总能检查出来不少.其实不管是菜鸟级还是资深级开发者都避免不了写出内存泄露的代码,规则大家都懂,可是 天知道什么时候手一抖就少写了个release? 好在项目决定转成ARC了,下面将自己转换的过程和中间遇到的问题写出来和大家共享,希望

Objective-C 【内存管理&amp;手动内存管理 综述】

------------------------------------------- 内存管理 (1)Objective-C的内存管理 栈区    存放局部变量(由于基本数据类型占用的存储空间是固定的,由系统去分配,我们不用去管,故栈区存放基本数据类型,) 堆区    存放程序运行过程中动态分配的内存空间(对象类型是程序运行过程中动态分配的,他们的大小不固定.比如说是我们Person new申请来的,存放在堆区,也是我们需要管理的) ★所以内存管理的范围是   继承了NSObject的所有对象

iOS经典面试题总结--内存管理

iOS经典面试题总结--内存管理 内存管理 1.什么是ARC? ARC是automatic reference counting自动引用计数,在程序编译时自动加入retain/release.在对象被创建时retain count+1,在对象被release时count-1,当count=0时,销毁对象.程序中加入autoreleasepool对象会由系统自动加上autorelease方法,如果该对象引用计数为0,则销毁.那么ARC是为了解决MRC手动管理内存存在的一些而诞生的. MRC下内存管