iOS中的内存管理精讲

main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
//        NSString *name = [[NSString alloc] initWithFormat:@"张三"];
//       // NSLog(@"%lu", [name retainCount]);
//        Person *p = [[Person alloc] init];
//        [p setName:name];
//        [p setName:name];
//        //p.name = name;
//        [name release];
//
//
//
//
//
//        NSString *name1 = [[NSString alloc] initWithFormat:@"张四"];
//        [p setName:name1];
//
//
//        [p sayHi];
        Student *stu = [[Student alloc] initWithName:@"张三" ];
        //stu - 1
        stu.name = [NSString stringWithFormat:@"习大大"];
        //stu.name -2

        [stu release];
        //stu - 0  stu.name 1
        //分析:[NSString stringWithFormat:@"习大大"]计数器为1
        //stu.name
//        NSLog(@"----%@",stu.name);
//
//       NSString * name = stu.name = [NSString stringWithFormat:@"习大大"];
//        NSLog(@"%lu",name.retainCount);
//         NSLog(@"----%@",stu.name);

//        NSString *str = [NSString stringWithFormat:@"习大大"];
//        NSLog(@"%lu", str.retainCount);
////        [stu setName:str];
////        stu.name = str;
//        [str retain];
//        //这里的name是堆区 有引用计数
//        stu.name = str;
//
//        NSLog(@"---%lu", str.retainCount);
//        NSLog(@"%lu",  stu.name.retainCount);
//        NSLog(@"=====%lu",  stu.name.retainCount);
//        [stu release];

        //这里的string是常量区没有引用计数
//        NSString *string = [[NSString alloc] initWithString:@"小芬"];
//        NSLog(@"%lu",[string retainCount]);

          }

    return 0;
}
/*
集合的内存管理:
 1.当向集合中添加元素时,元素的引用计数会被 +1;
 2.当元素从集合中移除时,元素的引用计数会被 -1;
 3.当集合销毁时,会将集合中所有元素 -1;

*/

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *genter;
@property (nonatomic, assign) NSInteger age;

- (void)sayHi;
@end

Person.m

#import "Person.h"

@implementation Person
@synthesize name = _name;
- (void)setName:(NSString *)name
{
//    if (_name != name) {  // 解决了野指针问题
//        [_name release]; // 解决内存泄露问题
//        _name = [name retain]; // 解决野指针问题
//    }
    //为什么不直接赋值,堆区对象的直接赋值是地址的赋值,在mian.m中
    //[name release];
    _name = name;
}
- (NSString *)name
{
    //把_name的计数器加1 放到自动释放池
    //苹果的安全处理机制
    return [[_name retain] autorelease];
}

//copy 内部实现
//- (void)setName:(NSString *)name{
//    if(_name != name)
//    {
//        [_name release];
//        _name = [name copy];
//    }
//}

- (void)sayHi
{
    NSLog(@"%@,%@,%ld", _name, _genter, _age);
}
- (void)dealloc
{
    [_name release]; // 在对象销毁之前,将实例变量的引用计数 -1
    [_genter release];
    NSLog(@"person没有了");
    [super dealloc]; // 调用父类
}
@end

Student.h

#import <Foundation/Foundation.h>

@interface Student : NSObject
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *gender;
@property (nonatomic, assign) NSInteger age;

- (id)initWithName:(NSString *)name;
+ (id)studentWithName:(NSString *)name;
@end

Student.m

#import "Student.h"

@implementation Student
//copy 内部实现
//- (void)setName:(NSString *)name{
//    if(_name != name)
//    {
//        [_name release];
//        _name = [name copy];
//    }
//}
@synthesize name = _name;
- (void)setName:(NSString *)name
{
    NSLog(@"%@",_name);
    NSLog(@"%lu",_name.retainCount);
    if (_name != name) {  // 解决了野指针问题
        [_name release]; // 解决内存泄露问题
        NSLog(@"%lu",_name.retainCount);
        _name = [name retain]; // 解决野指针问题
         NSLog(@"%lu",_name.retainCount);
    }
}
- (NSString *)name
{
    //把_name的计数器加1 放到自动释放池
    //苹果的安全处理机制
    return [[_name retain] autorelease];
}
- (id)initWithName:(NSString *)name{
    if (self = [super init]) {
        self.name = name;
        //_name = name;
    }
    return self;
}
+ (id)studentWithName:(NSString *)name{
    Student *stu = [[Student alloc] initWithName:name];
    return [stu autorelease];
}
- (void)dealloc
{
    NSLog(@"Student回收了");
    [super dealloc];
}
@end
时间: 2024-10-28 23:14:47

iOS中的内存管理精讲的相关文章

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",[

IOS阶段学习第20天笔记(OC中的内存管理)

IOS学习(OC语言)知识点整理 一.OC中的内存管理 1)概念:内存管理的对象为所有继承了NSObject的对象,对基本数据(如:int .float.double...)无效      OC中采用引用计数器对内存做管理,他是一个整数数据,表示对象引用的次数,每个对象分配4字节      的内存空间存放引用计数器.当一个对象的引用计数器为0时 它将被自动释放,反过来说 当使用alloc.      new .copy(mutableCopy)创建新对象时,引用计数器默认为1 2)黄金法则 当使

iOS学习第四天杂记--Objective-C中的内存管理

先说明下,原文为青玉伏案写的.我这只是学习而已. OC中的内存管理. OC中使用引用计数和垃圾回收来管理内存,在OC中为每个对象分配一个引用计数器,当对象刚刚被创建时其初始值为1,当有某段代码需要访问一个对象时,会将该对象的引用计数器加1(通过retain来实现):当访问一个对象结束时,会将该对象的引用计数器减1(通过release来实现):当计数器为0时,该对象占用的内存空间会被收回.在NSObject类有一个retainCount方法,调用该方法可获取当前对象的引用计数值. Tips:测试时

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

YJX_Driver_033_驱动中的内存管理

1. 驱动中的内存管理 A. 物理内存 B. 虚拟内存 C. Ring0地址和Ring3地址 D. 驱动程序和进程的关系 E. 分页和非分页内存 F. 分配内核内存 [120]了解两个概念:物理内存  虚拟内存 [140]以下概念针对 32位Windows操作系统(32位及以上的CPU)(32位 / 64位 CPU) [210]64位下的这些概念 略有区别 [240] “ A.物理内存:(Physical Memory Address) 目前主流的操作系统还是32位的XP,而32位的系统提供的寻

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,我们知道,计算机其实是很笨的,结果只有这两种时,它