iOS中的内存管理1

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
//    @autoreleasepool {
//
//        Person *p = [[Person alloc] initWithName:@"池" gender:@"nan" age:18];
//        NSLog(@"%lu",[p retainCount]);
//
//
//        NSLog(@"--------------");
//        Person *p1 = [p retain];
//        NSLog(@"%lu",[p retainCount]);
//        NSLog(@"%lu",[p1 retainCount]);
//
//        NSLog(@"--------------");
//
//        Person *p2 = [p1 retain];
//        NSLog(@"%lu",[p retainCount]);
//        NSLog(@"%lu",[p1 retainCount]);
//        NSLog(@"%lu",[p2 retainCount]);
//
//        NSLog(@"--------------");
//        //release 让对象的引用计数立即 -1
//        [p release];
//        NSLog(@"%lu", [p retainCount]);
//        [p release];
//        NSLog(@"%lu", [p retainCount]);
//        [p release];
//        NSLog(@"%lu", [p retainCount]);// 错误的
//        //谁才有引用计数的概念:
//        //1.堆区空间才有引用计数的概念
//        //2.堆区的对象才会有引用计数
//
//    }
//    Person *p = [[Person alloc] initWithName:@"张三" gender:@"男" age:18];
//    NSLog(@"%lu", [p retainCount]);
//    [p retain];
//    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//
//
//
//    [p autorelease];
//
//    NSLog(@"%lu",[p retainCount]);
//
//
//
//    [pool release];
//     NSLog(@"%lu",[p retainCount]);
//    

    //企业级题
//    @autoreleasepool {
//        for (long i = 0; i < 100000000; i++) {
//            @autoreleasepool {
//                Person *per = [[Person alloc] init];
//                [per autorelease];
//            }
//        }
//    }

    //内存管理原则:当你对一个对象进行了 alloc, retain, copy 操作,你就对该对象拥有了所有权,要对该对象负责,对其进行release,或者autorelease操作
    //在一个方法内部,要保证对象的+ 和 - 相等.

    //创建Person对象
    @autoreleasepool {
        Person *p = [Person personWithName:@"张三" gender:@"男" age:44];
        Person *p1 = [p copy];

        [p1 sayHi];
        [p1 release];
    }

    //内存问题:
    //1.野指针错误:最后一个release玩,空间已经被系统回收,如果再访问,就是访问一块没有所有权的空间,出现野指针,野指针不会立即报错,但是存在安全隐患,另外,错误不容易排错.
    //2.过度释放:对一块没有所有权的空间进行释放空间,会造成程序的立即crash;
    //3.内存泄露:对一块拥有所有权的空间,使用完之后没有释放,此时存在安全隐患,当内存泄露足够多得时候,造成程序的crash;
    return 0;
}

person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject<NSCopying>
@property (nonatomic,retain) NSString *name;
@property (nonatomic,retain) NSString *gender;
@property (nonatomic,assign) NSInteger age;

- (instancetype)initWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age;
+ (instancetype)personWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age;
- (void)sayHi;
@end

person.m

#import "Person.h"

@implementation Person
- (instancetype)initWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age
{
    if (self = [super init]) {
        self.name = name;
        self.gender = gender;
        self.age = age;
    }
    return self;
}

+ (instancetype)personWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age{
    return [[[self alloc] initWithName:name gender:gender age:age] autorelease];

}
- (void)sayHi
{
    NSLog(@"sayHigoggo");
}
//当对一个兑现copy时,会自动调用该方法,用来创建新的对象,复制内容
- (id)copyWithZone:(NSZone *)zone
{
    //1.创建新的对象
    Person *newPer = [[Person allocWithZone:zone] init];
    //2.拷贝内容
    newPer.name = self.name;
    newPer.age = self.age;
    newPer.gender = self.gender;
    //3.返回新的对象
    return newPer;
}
//当对象的引用计数为0是系统会自动调用,切记不要人为调用
- (void)dealloc
{
    NSLog(@"%@回收了",self);
    [super dealloc];
}
@end
时间: 08-11

iOS中的内存管理1的相关文章

Cocos2d-x开发中C++内存管理

由于开始并没有介绍C++语言,C++的内存管理当然也没进行任何的说明,为了掌握Cocos2d-x中的内存管理机制,是有必要先了解一些C++内存管理的知识.C++内存管理非常复杂,如果完全地系统地介绍可能需要一本书的篇幅才能解释清楚.这里只给大家介绍C++内存管理最为基本的用法. 内存分配区域创建对象需要两个步骤:第一步,为对象分配内存,第二步,调用构造函数初始化内存.在第一步中对象分配内存时候,我们可以选择几个不同的分配区域,这几个区域如下:栈区域分配.栈内存分配运算内置于处理器的指令集中,效率

Unity游戏开发中的内存管理_资料

内存是手游的硬伤——Unity游戏Mono内存管理及泄漏http://wetest.qq.com/lab/view/135.html 深入浅出再谈Unity内存泄漏http://wetest.qq.com/lab/view/150.html 这一次,我优化了37%的内存http://wetest.qq.com/lab/view/147.html Unity项目资源加载与管理http://wetest.qq.com/lab/view/124.html Android应用内存泄露分析.改善经验总结h

iOS夯实:内存管理

iOS夯实:内存管理 文章转自 内存管理 最近的学习计划是将iOS的机制原理好好重新打磨学习一下,总结和加入自己的思考. 有不正确的地方,多多指正. 目录: 基本信息 旧时代的细节 新时代 基本信息 Objective-C 提供了两种内存管理方式. MRR (manual retain-release) 手动内存管理这是基于reference counting实现的,由NSObject与runtime environment共同工作实现. ARC (Automatic Reference Cou

cocos2dx中的内存管理机制及引用计数

1.内存管理的两大策略: 谁申请,谁释放原则(类似于,谁污染了内存,最后由谁来清理内存)--------->适用于过程性函数 引用计数原则(创建时,引用数为1,每引用一次,计数加1,调用结束时,引用计数减1,当引用计数为0时,才会真正释放内存) --------->适用于注册性函数(消息处理,中断等场合) 2.cocos2dx中的内存管理采用引用计数和内存托管的原则 spr->retainCount();//获取对象的引用计数值 spr->retain();//引用计数加1 spr

关于OC中得内存管理问题,alloc,retain,release,copy,dealloc

我们都知道,一个手机,它的内存是有限的,而每一个手机应用都是需要一定空间,当应用所占空间过大时,系统就会发出警告,怎样在有限的空间中,做到更高效实用美观的效果呢? 这时候就牵涉到OC中得内存管理了. 在OC这门语言中,是不存在垃圾回收机制的,但是它采用了另外一种形式或者说方法,实现这一个空间回收的效果,那就是引用计数器. 别看-引用计数器,这个名字很高大上,实际是它就是一个整数. 所以OC中分配4个字节才存储它. 引用计数的值只有两种:0和非0,我们知道,计算机其实是很笨的,结果只有这两种时,它

C++中的内存管理

在C++中也是少不了对内存的管理,在C++中只要有new的地方,在写代码的时候都要想着delete. new分配的时堆内存,在函数结束的时候不会自动释放,如果不delete我分配的堆内存,则会造成内存泄露.所以我们要学会内存管理,不要内存泄露.在C++中的内存管理机制和OC中的还不太一样,在OC中的ARC机制会给程序员的内存管理省不少事,但在C++中没有ARC所以我们要自己管理好自己开辟的内存.Java中也有自己相应的内存管理机制,比如JDBC里的获取的各种资源在finally里进行close等

cocos2d-x中的内存管理机制

cocos2d-x中的内存管理机制    Object *obj = new Object();        obj->autorelease();//自动释放资源        //    {    //        //在这段中使用obj    //    obj->retain();//保留对象    //    obj->release();//手动释放资源    //    //    }            log("Count %d",obj-&g

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

在ARC之前,iOS内存管理无论对资深级还是菜鸟级开发者来说都是一件很头疼的事.我参 加过几个使用手动内存管理的项目,印象最深刻的是一个地图类应用,由于应用本身就非常耗内存,当时为了解决内存泄露问题,每周都安排有人值班用 Instruments挨个跑功能,关键是每次都总能检查出来不少.其实不管是菜鸟级还是资深级开发者都避免不了写出内存泄露的代码,规则大家都懂,可是 天知道什么时候手一抖就少写了个release? 好在项目决定转成ARC了,下面将自己转换的过程和中间遇到的问题写出来和大家共享,希望

黑马程序员--Objective-C之--OC中的内存管理

对于面向对象的变成语言,程序需要不断地创建对象. 初始,创建的所有程序通常都有指针指向它,程序可能需要访问这些对象的实例变量或调用这些对象的方法,随着程序的不断执行,程序再次创建了一些新的对象, 而那些老的对象已经不会再被调用,也不再有指针指向他们,如果程序没有回收他们占用的内存,就会出现内存泄露. 如果程序一直泄露内存,那么可用内存就会越来越少,直到没有足够的内存,程序將会崩溃.目前,主要有两种管理内存的技术,一是引用计数,二是垃圾回收. iOS平台目前只支持引用计数,Mac平台支持垃圾回收.

Cocos2d-x开发中Ref内存管理

Ref类是Cocos2d-x根类,Cocos2d-x中的很多类都派生自它,例如,我们熟悉的节点类Node也派生自Ref.我们介绍Ref内存管理.内存引用计数Ref类设计来源于Cocos2d-iphone的CCObject类,在Cocos2d-x 2.x中也叫CCObject类.因此Ref类的内存管理是参考Objective-C手动管理引用计数(Reference Count)而设计的.如图所示是内存引用计数原理示意图. 每个Ref对象都有一个内部计数器,这个计数器跟踪对象的引用次数,被称为"引用