辞职回家打算自学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. 实现控件WPF(4)----Grid控件实现六方格

    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 利用Grid控件能很轻松帮助我们实现各种布局.上面就是一个通过Grid单元格 ...

  2. 【M4】非必要不提供default 构造方法

    1.default 构造方法意味着,没有外来信息的情况下,进行初始化,构造出一个对象.对于有些对象是很合理的,比如数值之类的对象,可以初始化为0:对于指针之类的对象,初始化为null:对于集合如vec ...

  3. Codeforces GYM 100114 C. Sequence 打表

    C. Sequence Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Description ...

  4. androidstudio can't run git.exe

    今天用android studio从git下载项目的时候遇到一个问题,提示说can't run git.exe 问了下度娘以及谷歌.但是无果,后面捣鼓了一阵,下了一个git windows版本后,在a ...

  5. C/C++产生随机数

    <一> C/C++如何产生随机数:这里要用到的是rand()函数, srand()函数,C语言/C++里没有自带的random(int number)函数. (1)  假设你仅仅要产生随机 ...

  6. [Effective C++ --033]避免遮掩继承而来的名称

    这一章一直在想怎么写,因为比较基础,很容易理解,就按照需要来写吧. 假设我们有这样一个类: class Base { private: int x; public: ; virtual void mf ...

  7. Android N分屏模式Activity生命周期的变化

    昨天Google发布了Android N Preview, balabala....我是用模拟器去验证的, 通过长按多任务窗口(口)进入分屏模式, 这里只进行了简单的测试, 不排除通过配置哪个参数, ...

  8. Linux(Debian) vps安装gnome桌面+VNC

      昨天转载了一篇关于在Linux VPS上安装xface桌面并VNC连接的文章,因为文章是基于CentOS系统来操作的,有热心读者希望有一个Debian下的类似的东西,这就促成了今天的这篇文字.需要 ...

  9. PHP.6-PHP环境搭建(Windows环境下)-LAMP

    PHP环境搭建(Windows环境下)-LAMP Windows系统上分别独立安装Apache2.PHP5.MySQL5和phpMyAdmin等几个软件.独立安装的好处是可以自由选择这些组件的具体版本 ...

  10. iOS实现自定义的弹出视图(popView)

    前段时间,在项目中有个需求是支付完成后,弹出红包,实现这么一个发红包的功能.做了最后,实现的效果大致如下: 一.使用方法 整个ViewController的代码大致如下 // //  SecondVi ...