IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

为什么不要在init和dealloc函数中使用accessor

snuc的BLOG 2012-06-05 00:05:39 累计浏览 1,872 次
本机暂存

Apple在MaciOS中关于内存管理的开发文档中,有一节的题目为:“Don’t Use Accessor Methods in Initializer Methods and dealloc”,文中说:“The only places you shouldn’t use accessor methods to set an instance variable are in initializer methods and dealloc.”但是并没有解释为什么。

下面这则代码说明了一种可能会引起错误的情况:父类在init中使用了value的setter,而子类重写了value的setter,而子类的init中会首先调用父类的init,这样就会导致子类value的setter会先于子类自己的init代码调用,就有可能会出现问题。这则代码就会在_info初始化之前进行操作。

造成这个问题的原因有两个:一就是在init使用了setter;二是子类重写了setter,导致在父类init时就会调用子类重写的setter,万一重写的setter中进行了一些子类特有的操作就可能会出现问题。

实际上两个条件很难同时满足,但万一不小心满足就很难发现这个错误。不是说一定不能在init或dealloc中使用accessor,而是在使用的时候一定要明白可能会导致的问题,不要死记各种规则,而要真正理解背后的原理。

#import 

@interface Parent : NSObject

{

@protected

    int _value;

}

@property (nonatomic, assign) int value;

@end

@implementation Parent

@synthesize value = _value;

- (id)init {

    self = [super init];

    if (self) {

        // Initialize self.

        self.value = 1;

    }

    return self;

}

@end

@interface Child : Parent

{

    NSString *_info;

}

@end

@implementation Child

- (id)init {

    self = [super init];

    if (self) {

        // Initialize self.

        _info = @”child”;

    }

    return self;

}

- (void) setValue:(int)value

{

    _value = value;

    NSLog(@”%@”, _info);

}

@end

int main(int argc, const char * argv[])

{

    @autoreleasepool {

        // insert code here…

        Child *child = [[Child alloc] init];

        NSLog(@”%d”, child.value);

        [child release];

    }

    return 0;

}

同分类推荐文章

  1. 「置顶」我做了什么 (2026-05-05 12:13:28)
  2. 万字长文推演:手机不再从 App 开始,Agent OS 如何接管任务入口 (2026-04-28 14:57:22)
  3. Android Perfetto 系列 10 - Binder 调度与锁竞争 (2025-11-16 15:33:30)

查看更多 移动开发 文章 →

建议继续学习

  1. Java开发岗位面试题归类汇总 (累计阅读 22,157)
  2. Linux内存点滴 用户进程内存空间 (累计阅读 13,232)
  3. Linux Used内存到底哪里去了? (累计阅读 11,868)
  4. Linux操作系统的内存使用方法详细解析 (累计阅读 10,151)
  5. 几个内存相关面试题(c/c++) (累计阅读 9,447)
  6. top 命令补充 ( VIRT RES SHR) (累计阅读 9,117)
  7. Innodb分表太多或者表分区太多,会导致内存耗尽而宕机 (累计阅读 7,721)
  8. redis 运维实际经验纪录之一 (累计阅读 7,714)
  9. App的成本 (累计阅读 7,584)
  10. 必看!linux系统如何查看内存使用情况 (累计阅读 7,170)