> 需要手动维护的对象是Foundation提供类的对象和用户自定义类的对象。其实就是NSObject的子类。
NSInteger和CGFloat不需要手动回收,因为他们只是用defined定义的某基本类型的别名。
> 需要回收和对象引用计数值会大于零。当引用计数值减于零时,会除释放。
> 对象执行autorelease方法,可以将该对象加入当前所在回收池(NSAutoreleasePool)中。
> 自动释放池(NSAutoreleasePool)对象执行drain操作时,会将加入该池里自动回收的对象引用计数减掉该对象在这个池里执行autorelease的次数。
> 可以将一个对象加到多个自动释放池中。
> 对象执行一次release方法,就会将引用计数减1。
> 只有用[[Class alloc] initXXX]方式声明的对象才需要用[object release]方法释放一次。
> 在我们自定义Class时也应该满足上一条件。
> 我们自定义Class时,对于需要维护类型的对象属性,在@property定义属性时,应加上copy或retain参数。
例:
代码
1 //TestProperty.h
2 @interface TestProperty : NSObject {
3 NSString *name;
4 NSString *password;
5 NSInteger myInt;
6 }
7
8 @property (retain,nonatomic) NSString *name,*password;
9 @property NSInteger myInt;
10
11 -(void) rename:(NSString *)newname;
12
13 @end
14
15 //TestProperty.m
16 #import "TestProperty.h"
17
18
19 @implementation TestProperty
20
21 @synthesize name,password;
22 @synthesize myInt;
23
24 -(void) rename:(NSString *)newname{
25 // 这里可以直接写成
26 // self.name = newname;
27 //
28 if (name != newname) {
29 [name autorelease];
30 name = newname;
31 [name retain];
32 }
33 }
34
35 -(void) dealloc{
36 self.name = nil;
37 self.password = nil;
38 [super dealloc];
39 }
40
41 @end
42
43 //测试一
44 #import "TestProperty.h"
45
46 int main (int argc, const char * argv[]) {
47 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
48 TestProperty *test = [[TestProperty alloc] init];
49 NSMutableString *str = [NSMutableString stringWithString:@"this is name"];
50 test.name = str;
51 NSLog(@"%i",[str retainCount]);
52 [test release];
53 NSLog(@"%i",[str retainCount]);
54 [pool drain];
55 NSLog(@"%i",[str retainCount]);
56 return 0;
57 }
58 //输出
59 2010-12-30 10:20:30.447 HelloWorld[931:a0f] 2
60 2010-12-30 10:20:30.449 HelloWorld[931:a0f] 1
61 2010-12-30 10:20:30.450 HelloWorld[931:a0f] -1
62
63 //测试二
64 #import "TestProperty.h"
65
66 int main (int argc, const char * argv[]) {
67 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
68 TestProperty *test = [[TestProperty alloc] init];
69 NSMutableString *str = [NSMutableString stringWithString:@"this is name"];
70 [test rename:str];
71 NSLog(@"%i",[str retainCount]);
72 [test release];
73 NSLog(@"%i",[str retainCount]);
74 [pool drain];
75 NSLog(@"%i",[str retainCount]);
76 return 0;
77 }
78 //输出
79 2010-12-30 10:24:59.763 HelloWorld[984:a0f] 2
80 2010-12-30 10:24:59.776 HelloWorld[984:a0f] 1
81 2010-12-30 10:24:59.777 HelloWorld[984:a0f] -1