zoukankan      html  css  js  c++  java
  • OC中属性的内存管理

    在MRC模式下,我们建一个Person类的对象.h文件如下

     1 #import <Foundation/Foundation.h>
     2 
     3 @interface Person : NSObject
     4 @property (nonatomic, retain)NSString *name;
     5 @property (nonatomic, retain)NSString *sex;
     6 @property (nonatomic, assign)NSInteger age;
     7 //自定义初始化
     8 -(instancetype)initWithName:(NSString *)name Sex:(NSString *)sex Age:(NSInteger)age;
     9 //便利构造器
    10 
    11 +(instancetype)personWithName:(NSString *)name Sex:(NSString *)sex Age:(NSInteger)age;
    12 
    13 @end

    .m文件如下

    #import "Person.h"
    
    @implementation Person
    //在MRC下,如果需要同时重写setter和getter方法,必须下面的的语句
    @synthesize name = _name;
    //自定义初始化
    -(instancetype)initWithName:(NSString *)name Sex:(NSString *)sex Age:(NSInteger)age
    {
        if (self = [super init]) {
            _name = name;
            _sex = sex;
            _age = age;
        }
        return self;
    }
    //便利构造器
    
    +(instancetype)personWithName:(NSString *)name Sex:(NSString *)sex Age:(NSInteger)age
    {
        return [[[Person alloc] initWithName:name Sex:sex Age:age]autorelease];
    }
    //重写dealloc可以验证对象内存空间是否被收回,方式是否被调用
    -(void)dealloc
    {
        NSLog(@"这个对象被销毁");
        //以后只要在MRC中,重写dealloc方法,就需要一一对应为语义特征为retain或者copy的属性生成的实例变量release一次
        [self.name release];//针对sertter方法最后一次retain的release
        [_sex release];
        [super dealloc];
    }
    //MRC下,retain的内部实现 setter方法
    //-(void)setName:(NSString *)name
    //{
    //    if (_name != name) {
    //        [_name release];
    //        _name = [name retain];
    //    }
    //}
    //-(NSString *)name
    //{
    //    return [[_name retain]autorelease];
    //}
    -(void)setName:(NSString *)name
    {
        if (_name != name) {
            [_name release];
            _name = [name copy];
     
        }
    }
    -(NSString *)name
    {
        return [[_name retain]autorelease];
    }
    @end

    在MRC模式下,copy与retain的setter,getter方法写法一致,但是实现的机制不相同,前者是得到传入参数的副本,重新开辟空间,而后者是使引用计数加一

  • 相关阅读:
    IT名词备忘录——汇编
    逆转链表的实现
    编写安全的代码的一些技巧
    extern c 谈
    回调函数
    职场必备八个黄金句型
    CString类的用法介绍和自己动手写的CString类
    61条面向对象设计的经验原则(转贴)
    sprintf的用法
    VisualStudioVS2010统计代码行数
  • 原文地址:https://www.cnblogs.com/DevinSMR/p/5142874.html
Copyright © 2011-2022 走看看