iOS_使用ARC需要注意的问题(2)
1
2
3
4 - (void) dealloc
{
free(buffer_);
}
又或者是注册的delegate对象,观察者对象需要被删除的时候,也是在dealloc函数中动作。
1
2
3
4 - (void) dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
如果在ARC无效的时候,我们还要像下面一样,调用父类对象的dealloc函数。
1
2
3
4 - (void) dealloc
{
[super dealloc];
}
但是当ARC有效的时候,[super dealloc];的调用已经被编译器自动执行,已经不需要我们明示调用了。如果你在代码中还这样写,难免遇到下面的错误。
error: ARC forbids explicit message send of ’dealloc’
[super dealloc];
^ ~~~~~~~内存管理相关的函数必须遵循命名规则
在iPhone开发之深入浅出 (3) — ARC之前世今生中,我们知道如果是 alloc/new/copy/mutableCopy/init 开头的函数,需要将对象所有权返回给调用端。这条规则不管ARC是否有效都应该被遵守。只是 init 开头的函数比较特殊,他只在ARC下有要求,而且异常苛刻。
init 开始的函数只能返回id型,或者是该函数所属的类/父类的对象类型。基本上来说,init函数是针对alloc函数的返回值,做一些初始化处理,然后再将该对象返回。比如:
id obj = [[NSObject alloc] init];再比如下面定义的函数就是不对的:
- (void) initThisObject;需要是下面这样:
- (id) initWithObject:(id)obj;另外,下面名为 initialize 的函数比较特殊,编译器将把它过滤掉,不按上面的规则处理。
使用@autoreleasepool代替NSAutoreleasePool
在ARC之下,已经不能在代码中使用 NSAutoreleasePool,我们之前写 main.m 文件的时候,往往像下面这样写。
1
2
3
4
5
6 int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
而当ARC有效后,我们需要用@autoreleasepool代替NSAutoreleasePool。
1
2
3
4
5
6 int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
当编译器看到 @autoreleasepool 定义的块后会自动生成 NSAutoreleasePool 对象,并将需要的对象放入 AutoReleasePool 中,当出方块的定义范围时,pool 中的对象将被释放。
Objective-C 对象不能作为C语言结构体(struct/union)的成员
当我们设置ARC有效,并在C语言的结构体中定义Objective-C的对象时,将出现类似下面的编译错误。
1
2
3 struct Data {
NSMutableArray *array;
};
error: ARC forbids Objective-C objs in structs or unions
相关新闻>>
- 发表评论
-
- 最新评论 更多>>