iOS内存管理使用非自己生成对象的相关问题

一、用于测试的自定义类

@interface CustomedObj:NSObject

+ (instancetype) methodInit;
@end

@implementation CustomedObj

+ (instancetype)methodInit {
    CustomedObj *temp = [[CustomedObj alloc] init];
    return temp;
}

- (void) print {
    NSLog(@"==== Customed Object print");
}

- (void)dealloc {
    NSLog(@"对象即将被析构");
}
@end

二、实验结论

2.1  非自己生成的对象,即alloc/new/copy/mutableCopy以外的创建方法取得对象,并且赋值给非strong变量时,对象将会自动注册至autoreleasepool,从而不至于立刻被析构; (3.1)

2.2  当赋值给给strong变量时,编译器作自动优化插入objc_retainAutoreleaseedReturnValue, 而不是插入retain,以避免注册至autoreleasePool.(3.3)

2.3  访问weak变量时,将会把指向对象注册至autoreleasePool.(3.3)

三、实验代码

3.1   非alloc/new/copy/mutableCopy获取对象,自动注册至autoreleasepool

@autoreleasepool {
        __weak CustomedObj *weakRef = [CustomedObj methodInit];// 对象自动注册至autoreleasepool,执行完retainCount=1
        [weakRef print];//执行完retainCount=1
    }
    NSLog(@"退出 autoreleasepool”);

Log:
 ==== Customed Object print
 对象即将被析构
 退出 autoreleasepool

3.2   alloc/new/copy/mutableCopy获取对象,不会自动注册至autoreleasepool,必须主动强持有以保证不被析构

@autoreleasepool {
        __weak CustomedObj *weakRef = [[CustomedObj alloc] init];//编译警告,对象析构
        [weakRef print]; // print消息将被发至nil
    }
    NSLog(@"退出 autoreleasepool”);

LOG:
 对象即将被析构
 退出 autoreleasepool

3.3   weak指针被访问时,如未注册,系统自动将对象注册至autoreleasepool,引用计数增加

@autoreleasepool {
        CustomedObj *strongRef = [CustomedObj methodInit];//变量默认为__strong,因为编译器优化,将不会注册至autoreleasepool, retainCount=1
        __weak CustomedObj *weakRef = strongRef;
        [weakRef print];//调用weak指针会将对象注册到autoreleasepool,执行完retainCount=2
    }
    NSLog(@"退出 autoreleasepool");
LOG:
 ==== Customed Object print
 对象即将被析构
 退出 autoreleasepool
				
时间: 2024-10-10 00:28:44

iOS内存管理使用非自己生成对象的相关问题的相关文章

谈谈ios内存管理--持续更新

本文主要谈谈ios内存管理的发展脉络,不足之处,还请指教,相互学习交流.做ios开发,永远无法避开内存管理,无论我们是否有意识去考虑这个事情,但是只要我们写了OC程序,那么就与内存管理有关. 一.内存管理是做什么的? 二.内存管理方式一:MRC (一)引用计数器 (二)原则 (三)alloc.new.copy.mutableCopy.retain.release.dealloc alloc内部实现 引用计数表 (四)autorelease 三.内存管理方式二:ARC (一)__strong (二

IOS 内存管理

一.前言 对于大多数从C++或者JAVA转过来学习Object-C(以下简称OC)的人来说,OC这门语言看起来非常奇怪,用起来也有点麻烦. OC没有像JAVA一样的垃圾回收机制,也就是说,OC编程需要程序员手动去管理内存.这就是为什么它烦的原因,苹果却一直推崇开发者在有限硬件资源内写出最优化的代码,使用CPU最少,占用内存最小. 二.基本原理 对象的创建: OC在创建对象时,不会直接返回该对象,而是返回一个指向对象的指针,因此出来基本类型以外,我们在OC中基本上都在使用指针. ClassA  *

IOS内存管理学习笔记

内存管理作为iOS中非常重要的部分,每一个iOS开发者都应该深入了解iOS内存管理,最近在学习iOS中整理出了一些知识点,先从MRC开始说起. 1.当一个对象在创建之后它的引用计数器为1,当调用这个对象的alloc.retain.new.copy方法之后引用计数器自动在原来的基础上加1(ObjC中调用一个对象的方法就是给这个对象发送一个消息),当调用这个对象的release方法之后它的引用计数器减1,如果一个对象的引用计数器为0,则系统会自动调用这个对象的dealloc方法来销毁这个对象. [e

iOS内存管理(ARC,MRC)

iOS内存管理方式: ARC Automatic Reference Counting 自动引用计数 MRC Manual Reference Counting 手动引用计数 更改管理方式: 内存管理的问题: 1.内存泄露:不再需要的对象没有释放. 2.野指针:正在使用的对象提前释放. 引用计数: 1.每一个对象上都有一个引用计数器 2.当对象出生时引用计数器为1 3.当对象调用retain方法时引用计数器+1 4.当对象调用release方法时引用计数器-1 5.当一个对象引用计数为0时,这个

iOS内存管理(objective-c)

移动app开发中,由于移动设备内存的限制,内存管理是一个非常重要的话题.objective-c的内存管理,不仅是面试当中老生常谈的一个必问话题,也是日常项目开发中,特别需要重视的环节.对于笔者这种以java语言入门编程世界的开发者来说,习惯了垃圾收集器的自动化管理,对于oc的引用计数器管理方式,还是需要花功夫来学习和运用. 1. ARC 和 非ARC oc的内存管理方式,分为ARC(automatic reference counting自动引用计数)和非ARC模式.Apple 在 Xcode

IOS内存管理

原文链接:http://blog.csdn.net/weiqubo/article/details/7376189 1.  内总管理原则(引用计数)    IOS的对象都继承于NSObject,   该对象有一个方法:retainCount ,内存引用计数. 引用计数在很多技术都用到: window下的COM组件,多线程的信号量,读写锁,思想都一样.       (一般情况下: 后面会讨论例外情况)    alloc      对象分配后引用计数为1    retain    对象的引用计数+1

IOS内存管理retain,assign,copy,strong,weak

IOS内存管理retain,assign,copy,strong,weak IOS的对象都继承于NSObject, 该对象有一个方法:retainCount ,内存引用计数. 引用计数在很多技术都用到: window下的COM组件,多线程的信号量,读写锁,思想都一样. (一般情况下: 后面会讨论例外情况)alloc 对象分配后引用计数为1retain 对象的引用计数+1copy copy 一个对象变成新的对象(新内存地址) 引用计数为1 原来对象计数不变 release 对象引用计数-1 如果为

浅谈iOS内存管理机制

iOS内存管理机制的原理是引用计数,引用计数简单来说就是统计一块内存的所有权,当这块内存被创建出来的时候,它的引用计数从0增加到1,表示有一个对象或指针持有这块内存,拥有这块内存的所有权,如果这时候有另外一个对象或指针指向这块内存,那么为了表示这个后来的对象或指针对这块内存的所有权,引用计数加1变为2,之后若有一个对象或指针不再指向这块内存时,引用计数减1,表示这个对象或指针不再拥有这块内存的所有权,当一块内存的引用计数变为0,表示没有任何对象或指针持有这块内存,系统便会立刻释放掉这块内存. 其

iOS内存管理策略和实践

来源:http://www.baidu.com/link?url=irojqCBbZKsY7b0L2EBPkuEkfJ9MQvUf8kuNWQUXkBLk5b22Jl5rjozKaJS3n78jCnSsUZjVQvFIW1IKcJMlR2fGj9eiy-gCY7ulTRyEuAi 关于iOS内存管理 应用程序内存管理是:程序运行时,开辟的内存空间.使用它,释放它的过程,写的好的程序尽可能少使用内存.在Objective-C中,内存管理被看做是:在很多数据.代码下,分配 转自hherima的博客