//
// main.m
// OC_9练习
//
// Created by YIem on 15/12/4.
// Copyright (c) 2015年 www.yiem.net YIem博客. All rights reserved.
//

import <Foundation/Foundation.h>

import "Person.h"

import "ARCMOdel.h"

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

@autoreleasepool {
    

// 创建对象

    Person *p1 = [[Person alloc] initWithName:@"qwe" arr:@[@"asd"] age:10];
    [p1 release];
    // 遍历构造器
    Person *p2 = [Person personWithName:@"zxc" arr:@[@"rty"] age:20];
    // ARCModel
    ARCMOdel *m = [[ARCMOdel alloc] init];
    [m release];
    
   
    
    
    
    
}
return 0;

}



//
// ARCMOdel.h
// OC_9练习
//
// Created by YIem on 15/12/4.
// Copyright (c) 2015年 www.yiem.net YIem博客. All rights reserved.
//

import <Foundation/Foundation.h>

// ARC/MRC 混编
// ARC下使用MRC: -fno-objc-arc
// MRC下使用ARC: -fobjc-arc

@interface ARCMOdel : NSObject

@property (nonatomic, copy)
NSString *string;
@property (nonatomic, retain)
NSDictionary *dic;

@end


//
// ARCMOdel.m
// OC_9练习
//
// Created by YIem on 15/12/4.
// Copyright (c) 2015年 www.yiem.net YIem博客. All rights reserved.
//

import "ARCMOdel.h"

@implementation ARCMOdel

pragma mark - ARCsetter方法重写

  • (void)setString:(NSString *)string
    {
    if (_string != string) {

    _string = string;

    }
    }

  • (void)setDic:(NSDictionary *)dic
    {
    if (_dic != dic) {

    _dic = dic;

    }
    }

@end



//
// Person.h
// OC_9练习
//
// Created by YIem on 15/12/4.
// Copyright (c) 2015年 www.yiem.net YIem博客. All rights reserved.
//

import <Foundation/Foundation.h>

@interface Person : NSObject
@property (nonatomic, copy)
NSString *name;
@property (nonatomic, retain)
NSArray *arr;
@property (nonatomic, assign)
NSInteger age;
/// 初始化

  • (instancetype)initWithName:(NSString *)name

                         arr:(NSArray *)arr
                         age:(NSInteger)age;

    ///遍历构造器

  • (instancetype)personWithName:(NSString *)name

                           arr:(NSArray *)arr
                           age:(NSInteger)age;

    @end


//
// Person.m
// OC_9练习
//
// Created by YIem on 15/12/4.
// Copyright (c) 2015年 www.yiem.net YIem博客. All rights reserved.
//

import "Person.h"

@implementation Person

pragma mark - dealloc方法

  • (void)dealloc
    {

    // retain/copy的属性 必须写在dealloc中 让对应的成员变量release
    [_name release];
    [_arr release];
    [super dealloc];

    }

pragma mark - 初始化

  • (instancetype)initWithName:(NSString )name arr:(NSArray )arr age:(NSInteger)age
    {
    // 使用setter方法赋值 把要复制的内容引用计数 +1 防止提前释放
    self = [super init];
    if (self) {

    self.name = name;
    self.arr = arr;
    self.age = age;

    }
    return self;
    }

pragma mark - 遍历构造器

  • (instancetype)personWithName:(NSString )name arr:(NSArray )arr age:(NSInteger)age
    {
    Person *p = [[Person alloc] initWithName:name arr:arr age:age];
    // 遍历构造器中 使用autorelease平衡alloc
    return [p autorelease];
    }

pragma mark - 重写setter

  • (void)setName:(NSString *)name
    {
    // 1.判断成员变量中的内容和外部传人的内容是否是同一个
    if (_name != name) {

    // 2.release成员变量中的原数据
    [_name release];
    // 3.赋值新数据的同时 retain/copy新数据
    _name = [name copy];

    }
    }

  • (void)setArr:(NSArray *)arr
    {
    if (_arr != arr) {

    [_arr release];
    _arr = [arr retain];

    }
    }

  • (void)setAge:(NSInteger)age
    {
    // 非对象直接赋值
    _age = age;
    }

@end