IOS基础 Day-1手动内存管理
辞职回家打算自学IOS开发,就在借个地方记录一下
Day-1 手动内存管理
主要内容:release retain必须配对好,不然会占用内存 慢慢积累导致错误
一旦内存占用超过40m 45m时分别发生警告,一旦超过120m 系统将kill你的app 发生闪退
//
// main.m
// 1-1内存管理
//
// Created by k on 14-8-24.
// Copyright (c) 2014年 com.akleee.www. All rights reserved.
// #import <Foundation/Foundation.h>
#import "Person.h"
#import "Car.h"
void withParam(Person *p)
{
[p retain];
NSLog(@"withParam : %@ ,retainCount : %lu",p.myName,(unsigned long)[p retainCount]);
[p release];
} void test1()
{
Person * p1=[[Person alloc ]init]; NSLog(@"retainCount = %lu", (unsigned long)[p1 retainCount]); p1.myName=@"haha"; NSLog(@"p1 : %@",p1); Person * p2 = [p1 retain]; NSLog(@"retainCount = %lu", (unsigned long)[p1 retainCount]); p2.myName=@"gaga"; NSLog(@"p1 : %@",p1); NSLog(@"p2 : %@",p2); withParam(p2); [p2 release]; [p1 release]; p1=nil; NSLog(@"%@",p1);//如果p1!=nil 则会发生内存泄露 NSLog(@"%lu", [p1 retainCount]);//nil 但是不报错
} void test2()
{
Car * c1=[[Car alloc ] init:@"haha"];//初始化 带参数 的对象 NSLog(@"%@",c1); [c1 release];
} void test3(){
Person * p1=[[Person alloc]init:@"ak"]; Car * c1= [[Car alloc]init:@"雪弗兰"]; [p1 setCar:c1]; [p1 run]; //1
// NSLog(@"p1 retainCount : %lu", [p1 retainCount]);
//1
//NSLog(@"c1 retainCount : %lu", [c1 retainCount]); [c1 release]; [p1 release];
} void test4()
{
//测试property的retain
Person * p1=[[Person alloc]init]; Car * c1=[[Car alloc]init]; Car * c2= [[Car alloc]init]; NSLog(@"c1:%lu",(unsigned long)[c1 retainCount]); p1.car=c1; NSLog(@"c1:%lu",(unsigned long)[c1 retainCount]); p1.car=c2; NSLog(@"c1:%lu",(unsigned long)[c1 retainCount]); NSLog(@"c2:%lu",(unsigned long)[c2 retainCount]); [c1 release];
[c2 release];
[p1 release];
} void test5()
{
Person * p1=[[Person alloc]init]; Car * c1=[[Car alloc]init]; Car * c2= [[Car alloc]init]; //
NSLog(@"c1:%lu",(unsigned long)[c1 retainCount]);
//
NSLog(@"c2:%lu",(unsigned long)[c2 retainCount]); [p1 setCar2:c1]; //
NSLog(@"c1:%lu",(unsigned long)[c1 retainCount]); [p1 setCar2:c2]; //
NSLog(@"c1:%lu",(unsigned long)[c1 retainCount]); //
NSLog(@"c2:%lu",(unsigned long)[c2 retainCount]); NSString * s1=@"aaa"; // NSString * s2=@"bbb"; NSLog(@"s1:%lu",(unsigned long)[s1 retainCount]); [p1 setMyName:s1]; NSLog(@"s1:%lu",(unsigned long)[s1 retainCount]); [c1 release];
[c2 release];
[p1 release]; }
int main(int argc, const char * argv[])
{ @autoreleasepool { // test1();
// test2();
// test3();
test4();
//test5();
}
return ;
}
Person.h
//
// Person.h
// 1 基础知识
//
// Created by k on 14-8-24.
// Copyright (c) 2014年 com.akleee.www. All rights reserved.
// #import <Foundation/Foundation.h>
#import "Car.h" @interface Person : NSObject
@property (nonatomic,assign , readwrite ) NSString * myName ;
@property (nonatomic,retain,readwrite) Car * car;
-(instancetype)init:(NSString *) Name;
-(void) speakMyName;
-(void)setCar:(Car *) car;
-(void) run; -(void)setCar2:(Car*)car2;
@end
person.m
//
// Person.m
// 1 基础知识
//
// Created by k on 14-8-24.
// Copyright (c) 2014年 com.akleee.www. All rights reserved.
// #import "Person.h" @implementation Person
{
Car * _car2;
} - (instancetype)init:(NSString *) Name
{
self = [super init];
if (self) {
_myName=Name;
}
return self;
} -(void)speakMyName{ NSLog(@"大家好我的名字叫%@",_myName); } -(void)setCar2:(Car*)car2
{
if(_car2!=car2)
{
[_car2 release];
_car2=car2;
[car2 retain ];
}
} -(void)run{ NSLog(@"%@ 驾驶着 %@",_myName,_car.carName); } - (NSString *)description
{
return [NSString stringWithFormat:@"this is Person,myName=%@", _myName];
} - (void)dealloc
{
[_car2 release];
[super dealloc];
NSLog(@"Person对象被销毁");
}
@end
Car.h
//
// Car.h
// 1 基础知识
//
// Created by k on 14-8-24.
// Copyright (c) 2014年 com.akleee.www. All rights reserved.
// #import <Foundation/Foundation.h> @interface Car : NSObject @property (nonatomic,assign,readwrite) NSString * carName;
- (instancetype)init:(NSString *)Name; -(void)run;
@end
Car.m
//
// Car.m
// 1 基础知识
//
// Created by k on 14-8-24.
// Copyright (c) 2014年 com.akleee.www. All rights reserved.
// #import "Car.h" @implementation Car - (instancetype)init:(NSString *)Name
{
self = [super init];
if (self) {
_carName=Name;
}
return self;
}
-(void)run
{ NSLog(@"%@ is Running",_carName);
}
- (NSString *)description
{
return [NSString stringWithFormat:@"carName : %@", _carName];
}
- (void)dealloc
{
[super dealloc];
NSLog(@"Car %@ 被销毁",_carName);
}
@end
IOS基础 Day-1手动内存管理的更多相关文章
- 【iOS开发-33】学习手动内存管理临时抛弃ARC以及retain/assign知识——iOSproject师面试必考内容
我们为什么须要内存管理?当使用内存达到40M和45M时候会发出警告,假设不处理,占用内存达到120M时直接强制关闭程序. 所以出现闪退除了是程序出现逻辑错误,还有可能是内存使用过大. (1)创建一个对 ...
- Objective-C 基础教程第九章,内存管理
目录 Object-C 基础教程第九章,内存管理 前言: 对象生命周期 引用计数 RetainCount1项目例子 对象所有权 访问方法中的保留和释放 自动释放 所有对象放入池中 自动释放池的销毁时间 ...
- iOS经典面试题总结--内存管理
iOS经典面试题总结--内存管理 内存管理 1.什么是ARC? ARC是automatic reference counting自动引用计数,在程序编译时自动加入retain/release.在对象被 ...
- iOS-旧项目中手动内存管理(MRC)转ARC
在ARC之前,iOS内存管理无论对资深级还是菜鸟级开发者来说都是一件很头疼的事.我参 加过几个使用手动内存管理的项目,印象最深刻的是一个地图类应用,由于应用本身就非常耗内存,当时为了解决内存泄露问题, ...
- iOS学习笔记之ARC内存管理
iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...
- Objective-C 【内存管理&手动内存管理 综述】
------------------------------------------- 内存管理 (1)Objective-C的内存管理 栈区 存放局部变量(由于基本数据类型占用的存储空间是固定 ...
- object-C 手动内存管理(MRC)
object-C的内存管理和javascript的垃圾回收不一样,今天总结下手动内存管理,ARC的后边补上. 1:基本铺垫 oc采用引用计数来表示对象的状态,比如通过init创建出来的一个对象引用计数 ...
- Xcode 如何设置 自动内存管理 转换为 手动内存管理
建议使用自动内存管理 ARC. 如果不想自动内存管理,可以在build phases 下的compile sources 中找到不想自动管理的.m文件 ,给它加compiler flags 为 -fn ...
- 【CUDA 基础】4.2 内存管理
title: [CUDA 基础]4.2 内存管理 categories: - CUDA - Freshman tags: - CUDA内存管理 - CUDA内存分配和释放 - CUDA内存传输 - 固 ...
随机推荐
- JSF教程(10)——生命周期之Update Model Values Phase
在整个JSF生命周期中经历了取值.验证的阶段终于从request中拿到合理的值,以下就是在本阶段给相应的服务端对象(ManageBean)赋值了.JSF实现仅仅是去更新和input组件中value属性 ...
- glsl水包含倒影的实现(rtt) [转]
转自 http://blog.sina.com.cn/s/blog_78ea87380101eixi.html 此文实现一个简单地水面倒影效果,通过rtt相机 获取倒影纹理, 水的基本实现方法(参考前 ...
- S_ISREG等几个常见的宏 struct stat
S_ISLNK(st_mode):是否是一个连接.S_ISREG(st_mode):是否是一个常规文件.S_ISDIR(st_mode):是否是一个目录S_ISCHR(st_mode):是否是一个字符 ...
- pydev+python+Eclipse环境搭建+ 调试快捷键汇总
http://www.cnblogs.com/Bonker/p/3584707.html 编辑器: Eclipse + pydev插件 1. Eclipse是写JAVA的IDE, 这样就可以通用了,学 ...
- SVN 修改URL路径
http://strugglelinux.blog.51cto.com/1009905/672008 标签:休闲 SVN 修改URL路径 职场 原创作品,允许转载,转载时请务必以超链接形式标明文章 原 ...
- Linux内核加载全流程
无论是Linux还是Windows,在加电后的第一步都是先运行BIOS(Basic Input/Output System)程序——不知道是不是所以的电脑系统都是如此.BIOS保存在主板上的一个non ...
- ASP.NET 去除所有HTML标记的方法
using System.Text.RegularExpressions /// <summary> /// 去除HTML标记 /// </summary> /// <p ...
- python学习笔记(三)--条件语句
Python 条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. Python 编程中 if 语句用于控制程序的执行,基本形式为: if 判断条 ...
- UITableViewCell高度自适应探索--AutoLayout结合Frame
UITableViewCell高度自适应探索--UITableView+FDTemplateLayoutCell地址: http://www.jianshu.com/p/7839e3a273a6UIT ...
- iCloud之旅
1.创建BIDTinyPixDocument类 #import <UIKit/UIKit.h> //创建文档类 @interface TinyPixDocument : UIDocumen ...