iOS_使用ARC需要注意的问题(2)

来源:未知 责任编辑:责任编辑 发表时间:2014-01-20 07:51 点击:

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

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • Lexical or Preprocessor Issue 'xxx.h
  • ios学习笔记(二)xcode 4.3.2下实现基本交互
  • ios版本的helloworld
  • iphone(object-c) 内存管理(3) 有效的内存管理 前半部分
  • ios学习笔记(一)xcode 4.3.2下创建第一个ios项目
  • IOS类似iphone通讯录TableView的完整demo【附源码】
  • UITableView一些方法
  • [iPhone中级]iPhone团购信息客户端的开发 (二)
  • iphone(object-c)内存管理(1)
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1