IOS学习笔记之五:Memory Management 内存管理

本文详细探讨了iOS中的内存管理,包括reference counting、autorelease、ownership原则、自动引用计数(ARC)、weak与strong引用、内存泄漏预防以及对象创建等方面。通过实例代码解释了如何有效地管理内存,尤其是处理大量对象时如何避免内存压力。同时提到了iOS中不同于Java的内存自动管理特性,并建议减少使用convenience method以优化内存使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.与java不同的是我们需要自己来管理内存。(Java 是自动管理内存)

2.内存管理中一个比较重要的概念是reference counting.

下面通过一段代码来详细的了解:

@interface RetainTracker : NSObject
@end // RetainTracker
@implementation RetainTracker
 - (id) init
 {
  if (self = [super init]) {
       [self retainCount]);

}

NSLog (@"init: Retain count of %d.",
return (self);
} // init
- (void) dealloc
{
  NSLog (@"dealloc called. Bye Bye.");
  [super dealloc];
} // dealloc
@end // RetainTracker

3.关于ownership的理解

- (void) setEngine: (Engine *) newEngine
{
 [newEngine retain];//为了防止newEngine被release到0
 [engine release];//使上一个engine释放
 engine = newEngine;//将一个一般不为0的newEngine赋值给已经被释放过了得engine;
} // setEngine
4.alloc 和new的区别
先来看看分别得使用方法:
 className* object = [className new];
className* object = [[className alloc] init];
这两句话其实是一样的,因为new方法内部也是调用了alloc 和init,但是用alloc 和init的好处是这样可以使用别的init的方法,而new的话只能用默认的那种init的方法,如果确定只要一种init的方法的话,就直接用new会比较简单快捷。例如只是简单的声明一个NSString什么的.
4.Autorelease

@autoreleasepool {

        

        - (NSString *) description

        {

            NSString *description;

            description = [[NSString alloc]

                           initWithFormat:@"I am %d years old", 4];

            return ([description autorelease]);

        } // description

        

    }

autorelease可以用来简化手动释放的麻烦。

创建autorelease pool的方式。

一种就是像上边写的,用@autoreleasepool

另一种就是用一个对象来对autorelease pool进行操作,代码如下:

NSAutoreleasePool *pool;
pool = [NSAutoreleasePool new];
...
[pool release];

5.当transient使用时,记得new,alloc or copy 的方法需要使用release来释放,而其他方式的调用或者拥有就不需要再管了;长期使用时,以上三种方法需要记得释放,而其他的方法需要的时候就retain,用完了就release。

自动释放池的净化是需要时间的,而在创建这一百万个description的时间缝隙中,净化池的释放是无法完成的,所以现有的净化池中将会含有一百万个对象等待被释放,这就对内存造成了压力,

int i;

for (i = 0; i < 1000000; i++) {
 id object = [someArray objectAtIndex: i];
 NSString *desc = [object description];
 // and do something with the description

}

这个时候需要我们来为净化池的创建制造时间断点,例如可以每1000个对象放在一个池子里,代码如下:

NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
int i;
for (i = 0; i < 1000000; i++) {

id object = [someArray objectAtIndex: i];NSString *desc = [object descrption];
// and do something with the description 

if (i % 1000 == 0) {

 [pool release];
 pool = [[NSAutoreleasePool alloc] init];
 }
}
[pool release];
上边的这段非常重要,它就讲明白了如何通过手动的方式来为自动释放池的净化设置时间间隔。

而且如果不释放池子的话,池子中的对象还是会存在的。

6.当把垃圾收集设置打开的时候,可以把nil赋值给一个变量来让回收机制知道,这个对象或者变量可以被净化掉了。

7.convenience method的的意思是指那些可以给你返回新对象的method,apple建议在iOS中尽量少使用这种方法,例如NSString中所有以stringWith开头的方法都是convenience的方法。

8.另外一个重要的概念ARC,which is short for automatic reference counting.

ARC插入合适的retain和release,为开发者管理内存,在编译的时候,ARC才会起作用。

另外,

ARC只对以下三种ROPs起作用,ROPs意思是retainable object pointers.

1)  Block pointers

2)  Objective-C object pointers

3)  Typedefs marked with __attribute__((NSObject)) 

9.关于weak reference 和strong reference,主要是为了防止被别的对象创建的对象,当创建者被回收的时候,被创建者不再被指向,但是其本身却还在占着内存的现象。这里涉及到一个概念,zeroing weak references.

10.需要请教的疑问,没有garbage collection的选项。

11.另外一个名词,bridged cast。

中间粉色的标记部分略过,后边第二次看书的时候再浏览一遍。

12.异常的关键词

在cocoa框架中,throw NSException objects only.(这一部分暂时先跳过,等到理解了throw的含义再)下面直接进入接下来的重点章节部分。

对象的创建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值