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只允許單繼承,解決多繼承的方法是協議。(協議和代理)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章