小白学开发(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"

void test();

void test5(Person * p);

int main(int argc, const char * argv[]) {

//   test();

Person *p = [[Person alloc]init];

test5(p);

[p release];

NSLog(@"%lu",p.retainCount);

[p release];

return 0;

}

void test()

{

Person *p = [[Person alloc]init];   //  retainCount = 1

p.age = 10;

NSLog(@"%@", p);

[p release];    //  retainCount = 0 对象被回收

[p run];//  通过已经被回收的对象,调用对象的方法,此刻这个指针称之为野指针,这样的调用是错误的

/*

注意:

系统已经将p所指向的对象回收了

EXC_BAD_ACCESS 访问了不可访问的内存空间

被系统回收的对象我们称之为僵尸对象

默认情况下xcode为了提高编码效率,不会实时检查僵尸对象

*/

/*

方法:  为了防止野指针操作,当我们确定当前作用域中的对象不会再被使用了,通常我们会把不再使用的指针变量赋值为nil

*/

p = nil;

p.age = 30;  // 那么这两句就表示:nil.age = 30;

[p run];      //   [nil run]

}

void test2()

{

/*

内存泄漏: 内存泄漏指,不再被使用的对象,一直在内存中没有被回收

即:只要对象的retainCount != 0 那么这个对象就一直在内存中

*/

//  一下分析两种内存泄漏的情况:

//  内存泄漏的第一种情况:

Person *p = [[Person alloc]init];//retainCount = 1

p.age = 10;

[p retain]; //retainCount = 2

[p retain]; //retainCount = 3

[p release];//retainCount = 2

[p release];//retainCount = 1

//  这里对象的retainCount != 0 对象就不会被销毁,即对象一直在内存中

}

void test3()

{

Person *p = [[Person alloc]init];

p.age = 90;

//  内存泄漏的第二种情况:

[p run];

p = nil;

[p release];    //  这里只是将指向对象的指针赋值为nil了,而这里是[nil release],事实上对象还是在内存中,并没有被释放,并且此时没有指针指向这个对象

}

void test4()

{

Person *p = [[Person alloc]init];

p.age = 80;

Person *p2 = p;

[p release]; // 这里已经将对象销毁

[p2 run];   //  有指针,可是没有对象,所以这里是野指针操作

}

void test5(Person * p)

{

p.age = 50;

NSLog(@"%@",p);

[p retain];

NSLog(@"%lu",p.retainCount);

}

//

//  Person.h

//  手动内存管理

//

//  Created by admin on 15/8/3.

//  Copyright (c) 2015年 admin. All rights reserved.

//

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property int age;

- (void)run;

@end

//

//  Person.m

//  手动内存管理

//

//  Created by admin on 15/8/3.

//  Copyright (c) 2015年 admin. All rights reserved.

//

#import "Person.h"

@implementation Person

- (void)dealloc

{

[super dealloc];

NSLog(@"对象被销毁了");

}

- (NSString *)description

{

return [NSString stringWithFormat:@"age = %d", _age];

}

- (void)run

{

NSLog(@"人跑起来了");

}

@end

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 20:03:08

小白学开发(iOS)OC_ 单个对象的内存管理(2015-08-02)的相关文章

oc55--ARC单个对象的内存管理

// Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @end // Person.m #import "Person.h" @implementation Person - (void)dealloc { NSLog(@"%s", __func__); // [super dealloc]; //ARC不准写 } @end // // main.m // A

oc中单个对象的内存管理

1.堆:存放的是一些动态分配的对象/类,系统是不会自动回收这些内存的 2.栈:存放的是一些临时的和局部变量,一旦不在作用域内,就会自动回收内存 3.oc中回收堆中动态分配的对象的内存的机制:引用计数器 引用计数器:在每个对象的内存中都有一个4个字节的引用计数器(int),每当对象被创建时,引用计数器的值就是1,当该值为0时,该对象的内存空间就被回收了 调用对象的 retain  方法 会使得计数器数字 +1,同时返回对象本身 调用对象的 release  方法 会使得计数器数值 -1 调用对象的

oc56--ARC多个对象的内存管理

// main.m // ARC中多个对象的内存管理:ARC的内存管理就是MRC的内存管理(一个对象释放的时候,必然会把它里面的对象释放),只不过一个是Xcode加的代码,一个是我们自己加的代码: // // ARC单个对象的内存管理:不使用的时候就置为nil,该对象没有引用就会立即释放. // MRC的时候,set一个对象的时候就把这个对象retain一次,当这个对象释放的时候就把它的对象属性release一次. // #import <Foundation/Foundation.h> #i

小白学开发(iOS)OC_多个对象的内存管理(2015-08-03)

// //  main.m //  多个对象的内存管理 // //  Created by admin on 15/8/5. //  Copyright (c) 2015年 admin. All rights reserved. // #import <Foundation/Foundation.h> //  人拥有一辆汽车 #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepo

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: ARC &amp; MRC下string内存管理策略探究

ARC & MRC下string内存管理策略探究 前两天跟同事争论一个关于NSString执行copy操作以后是否会发生变化,两个人整了半天,最后写代码验证了一下,发现原来NSString操作没我们想的那么简单,下面就让我们一起看看NSString和NSMutableString在MRC下执行retain,copy,mutableCopy,以及ARC下不同的修饰__weak, __strong修饰赋值究竟发生了什么. 一.验证代码如下: - (void)testStringAddress { i

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

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

block没那么难(三):block和对象的内存管理

本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 在上一篇文章中,我们讲了很多关于 block 和基础变量的内存管理,接着我们聊聊 block 和对象的内存管理,如 block 经常会碰到的循环引用问题等等. 获取对象 照例先来段代码轻松下,瞧瞧 block 是怎么获取外部对象的 /********************** capturing objects **************