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什么的.
@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的含义再)下面直接进入接下来的重点章节部分。
对象的创建。