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内存传输 - 固 ...
随机推荐
- Git Cmd
http://my.oschina.net/sunboy2050/blog/55749
- UVALive 7070 The E-pang Palace 暴力
The E-pang Palace Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/problem ...
- URAL 2046 A - The First Day at School 模拟题
A - The First Day at SchoolTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudg ...
- Http Message Converters with the Spring Framework--转载
原文:http://www.baeldung.com/spring-httpmessageconverter-rest 1. Overview This article describes how t ...
- iOS10全新推送功能的实现
从iOS8.0开始推送功能的实现在不断改变,功能也在不断增加,iOS10又出来了一个推送插件的开发(见最后图),废话不多说直接上代码: 在开始之前需要打开一个推送开关,不然无法获取deviceToke ...
- log4j个人使用整理
Log4j介绍: 略过. 配置: Eclipse项目中添加log4j.jar到lib下. 在bin目录下新建log4j.properties,编辑好log4j配置文件. 样例分析: log4j.roo ...
- 手把手教你使用Size Class
在 iOS8 中,我们不用再像以前那样,一个页面新建多个 xib 文件来适配不同类型的屏幕,现在我们可以把各种尺寸屏幕的适配工作放在一个文件中完成,然后可以通过不同类别的 Size 来定制各种尺寸的界 ...
- struts配置信息
struts.xml文件 <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PU ...
- VB.net 字符串 分割 及 重新倒序组装
''' <summary> ''' split with ">>>>" , and inverted order ''' </summar ...
- LeetCode 231
Power of Two Given an integer, write a function to determine if it is a power of two. /************* ...