iOS入门(二十三)内存管理

内存问题体现在两个方面: 内存溢出,野指针异常
内存管理的方式: 垃圾回收( gc) 
MRC    人工引用计数(Manual Reference Count)  
ARC   自动引用计数(Auto Reference Count)
堆内存只有正在使用和销毁两种状态
影响引用计数的方法:
+alloc (开辟, 0 -> 1)      retain   ( + 1)   copy      release       autorelease 
dealloc(继承自父类的方法)
[pool release] 释放池子
[pool drain] 池子清道
当自动释放池释放或者清道的时候   autorelease的对象释放。

对空指针进行任何操作都无意义

    -跟retain不同,⼀一个对象想要copy,⽣生成⾃自⼰己的副本,需要实现 NSCopying协议,定义copy的细节(如何copy)。如果类没有接 受NSCopying协议⽽而给对象发送copy消息,会引起crash。    


 

    @implementation Person

    - (id)copyWithZone:(NSZone *)zone{  

        Person *p = [[Person allocWithZone:zone]init];
        p.age = self.age;

        p.name = self.name;

        return p;   

    }


    @property(nonatomic,assign)NSString *name;

    - (void)setName:(NSString *)name{

        _name = name; }

    - (NSString *)name{

        return _name; }

 

    @property(nonatomic,retain)NSString *name;

    - (void)setName:(NSString *)name{

        if(_name != name){ [_name release]; _name = [name retain];

        } }

  -(NSString *)name{

        return [[_name retain]autorelease];

    }


 

-(id)initWithName : ( NSString *)name

{

    self = [super init];

    if (self) {

        self.name = name;

    }

    return self;

}


- (void)setName:(NSString *)name

{

    if(_name != name)

    {

        [_name release];

        _name = [name copy];

    }

}

 


- (NSString *)name{

    return [[_name retain]autorelease];

}

set 和get 方法只能重写一个。

内存泄露

dealloc

永远不要手动调用dealloc , dealloc 的最后一行必须要写[super dealloc].

便利构造器:

return[p autorelease]


collection : 加入的对象自动retain , 移除的对象自动release ,本身释放时,对内部所有的对象release 。



http://blog.csdn.net/jobtong/article/details/8453434 

http://blog.csdn.net/chenzhiqin20/article/details/8497419http://www.douban.com/note/210192618/


 

NSString * str = [NSString stringWithFormat:@"asfpngyuipng"];

    if ([str rangeOfString:@"png"].length > 0) {

        str = [str stringByReplacingOccurrencesOfString:@"png" withString:@""];

    }

    NSLog(@"%@",str);

 


创建对象时,对象的内存分配在堆区,指向对象的指针分配在栈区,堆区内存需要程序员手动申请和释放。


oc只允许单继承,解决多继承的方法是协议。(协议和代理)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值