4.内存管理

1.Boy.h文件

#import <Foundation/Foundation.h>
@interface Boy : NSObject<NSCopying>

@property(nonatomic,retain)NSMutableArray *arr;
@property(nonatomic,copy)NSString *name;
@property(nonatomic,assign)NSInteger age;
@property(nonatomic,retain)Girl *girl;

- (void)setName:(NSString *)name;
+ (Boy *)boy;
//自己定义的初始化方法
- (id)initWithName:(NSString *)name age:(NSInteger)age;
//便利构造器初始化方法
+ (id)boyWithName:(NSString *)name age:(NSInteger)age;

@end

2.Boy.m文件

#import "Boy.h"
@implementation Boy

+ (Boy *)boy
{
    Boy *boy = [[Boy alloc] init];
    return [boy autorelease];
}

- (id)initWithName:(NSString *)name age:(NSInteger)age
{
    self = [super init];
    if (self) {
        //_name = name;
        //_age = age;
        //内存的优化---------------->
        self.name = name;
        _age = age;//<--->self.age = age
        //对象创建之后,里面的数组也会创建好,不用在外面进行创建,以免忘了造成问题
        self.arr = [NSMutableArray array];
    }
    return self;
}

+ (id)boyWithName:(NSString *)name age:(NSInteger)age
{
    Boy *boy = [[Boy alloc] initWithName:name age:age];
    return [boy autorelease];
}

//setter方法的完整版-------------->
- (void)setName:(NSString *)name
{
    //设置器里面不能对属性赋值,只能对成员变量赋值
    // self.name = name; (导致死循环)
    //刚开始_name为nil,对nil进行release对系统而言就是一句废话不执行
    if (_name != name) {
        [_name release];
        _name = [name retain];
    }
    //[name retain];
    //[_name release];
    //_name = name;
}

//实现NSCopying协议方法
-(id)copyWithZone:(NSZone *)zone
{
    Boy *boy = [Boy allocWithZone:zone];
    boy.name = _name;
    boy.age = _age;
    return boy;
}

//把成员变量里面的+1的操作全部减去
- (void)dealloc
{
    [_name release];
    [_girl release];
    [super dealloc];
}

@end

3.内存管理

//对象被创建出来之后的引用技术retainCount就是1
        Boy *boy = [[Boy alloc] init];//--->+1
//retain对对象的引用计数+1;release对对象的引用计数-1
        [boy retain];//--->+2
        [boy release];//--->+1
//当对象retainCount为1时再调用release的时候,这个对象就不在对他的引用计数进行-1操作,而是直接调用dealloc方法,所以我们在访问对象的引用计数还是1
       [boy release];//--->+1
//NSString的对象在全局静态区,她的引用计数为-1,代表正整数的最大值,其他的对象都在堆区
NSString *str = @"heihei";//retainCount--->-1
NSString *str = [[NSString alloc] initWithString:@"hehei"];//retainCount--->-1
//如果对象是我们进行alloc或则retain之后我门就获取了对象的所有权,就可以对对象进行release操作
//便利构造器在返回对象的时候会加上一个autorelease.所以由它创建对象不需要对内存进行管理
        NSArray *arr1 = [[NSArray alloc] initWithObjects:@"1",@"2", nil];
        NSArray *arr2 = [NSArray arrayWithObjects:@"3",@"4", nil];
        [arr1 release];
//id是泛型指针,可以用在任何的方法中,但是instancetype代表实例类型,用在自定义初始化方法,便利构造器作为返回值类型使用,标识方法会返回一个对象回去
//不可变字典可以通过mutableCopy转换成可变的数组字典
//mutableCopy出来的对象是可比变的,copy是不可变的
        Boy *boy = [Boy boyWithName:@"zhangyan" age:22];
        Boy *newBoy = [boy copy];
//如果自己的类(或者系统的类)想要实现copy功能,就必须遵守和实现NSCopying协议方法copyWithZone
//copy也可以改变引用计数,但是他改变的是新对象的引用计数,而原来的引用计数不变
//当对象放入到容器Array或者字典中,对象会被容器进行一次持有,就是retain一次,他的引用计数就会+1,是为了防止空指针的问题,从容器中移除时就会相应的-1
Boy *boy1 = [[Boy alloc] init];//boy1.retainCount--->+1
NSMutableArray *arr = [NSMutableArray arrayWithObjects:boy1 ,nil];
NSLog(@"%ld",[boy1 retainCount]);//--->+2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值