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

Day-1      手动内存管理                  


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

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

主要要防止发生的问题:
1.野指针操作
2.内存泄漏 
理解retain和assign的区别和 retain的原理
Main
  //
// 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手动内存管理的更多相关文章

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

    我们为什么须要内存管理?当使用内存达到40M和45M时候会发出警告,假设不处理,占用内存达到120M时直接强制关闭程序. 所以出现闪退除了是程序出现逻辑错误,还有可能是内存使用过大. (1)创建一个对 ...

  2. Objective-C 基础教程第九章,内存管理

    目录 Object-C 基础教程第九章,内存管理 前言: 对象生命周期 引用计数 RetainCount1项目例子 对象所有权 访问方法中的保留和释放 自动释放 所有对象放入池中 自动释放池的销毁时间 ...

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

    iOS经典面试题总结--内存管理 内存管理 1.什么是ARC? ARC是automatic reference counting自动引用计数,在程序编译时自动加入retain/release.在对象被 ...

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

    在ARC之前,iOS内存管理无论对资深级还是菜鸟级开发者来说都是一件很头疼的事.我参 加过几个使用手动内存管理的项目,印象最深刻的是一个地图类应用,由于应用本身就非常耗内存,当时为了解决内存泄露问题, ...

  5. iOS学习笔记之ARC内存管理

    iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...

  6. Objective-C 【内存管理&手动内存管理 综述】

    ------------------------------------------- 内存管理 (1)Objective-C的内存管理 栈区    存放局部变量(由于基本数据类型占用的存储空间是固定 ...

  7. object-C 手动内存管理(MRC)

    object-C的内存管理和javascript的垃圾回收不一样,今天总结下手动内存管理,ARC的后边补上. 1:基本铺垫 oc采用引用计数来表示对象的状态,比如通过init创建出来的一个对象引用计数 ...

  8. Xcode 如何设置 自动内存管理 转换为 手动内存管理

    建议使用自动内存管理 ARC. 如果不想自动内存管理,可以在build phases 下的compile sources 中找到不想自动管理的.m文件 ,给它加compiler flags 为 -fn ...

  9. 【CUDA 基础】4.2 内存管理

    title: [CUDA 基础]4.2 内存管理 categories: - CUDA - Freshman tags: - CUDA内存管理 - CUDA内存分配和释放 - CUDA内存传输 - 固 ...

随机推荐

  1. android SoundPool播放音效

    MediaPlayer的缺点: 资源占用量高,延时时间较长 不支持多个音效同一时候播放 SoundPool主要用于播放一些较短的声音片段,CPU资源占用率低和反应延时小,还支持自行色设置声音的品质,音 ...

  2. windows下远程adb

    Android 使用 adb命令 远程安装apk cmd下到你的adb文件夹,一般在platform-tools下. adb devices 列出全部设备 adb connect xxx.xxx.xx ...

  3. password安全之动态盐

    首先,我们看看什么是盐:http://zh.wikipedia.org/zh/%E7%9B%90_%28%E5%AF%86%E7%A0%81%E5%AD%A6%29 ,再MD5是d16e970d6e5 ...

  4. Ruby on Rails Tutorial 第一章 之 搭建开发环境

    云端开发环境,Cloud9(https://ide.c9.io/).这个开发环境预先安装好了Rails开发所需要的大多数软件,包括Ruby.RubyGems和Git,需要自己安装Rails. 1.安装 ...

  5. java_接口和抽象类的区别

    1. 接口只能定义抽象方法,不包含已经提供实现的方法. 抽象类可以包含普通方法 2. 接口不能定义静态方法.抽象类可以定义静态方法 3. 接口里只能定义静态常量filed,不能定义普通filed. 抽 ...

  6. 我cnblogs的主题

    我的cnblogs主题 这里记录的是本博客的主题存档 主题代码参考自:流云诸葛的博客 博客皮肤选择 选择 LessIsMore 页面定制CSS代码 div.post div.entry { font- ...

  7. 使用GPS经纬度定位附近地点(某一点范围内查询)

    需要手机查找附近N米以内的商户,致想法是已知一个中心点,一个半径,求圆包含于圆抛物线里所有的点,经纬度是一个点,半径是一个距离,不能直接加减,下面提供C#的解决方法 数据库中记录了商家在百度标注的经纬 ...

  8. JavaScript与FileSystemObject

    什么是FileSystemObject(简称FSO)  FSO 即文件系统对象,是一种列表 Windows 磁盘目录和文件,对目录和文件进行删除.新建.复制.剪切.移动等操作的技术.使用 FSO 网站 ...

  9. Android(java)学习笔记72:线程的状态转换图以及常见执行情况

    1. 线程的状态转换图以及常见执行情况: 2. 线程状态类型: (1)新建状态(New):新创建了一个线程对象.(2)就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start() ...

  10. Obout - ASP.NET HTML Editor

    ASP.NET MVC HTML Editor http://www.obout.com/mvc-editor/index.aspx http://www.obout.com/index.aspx H ...