街角_祝福

导航

Objective-C的内存管理

原则

 内存管理原则:
 1.谁使的引用计数增加,那他也要负责对应的引用计数减少(类似C++,谁new谁delete)
 2.可以对nil的对象release(类似c++允许delete的对象为NULL一样)
 3.当对象引用计数为0时,系统会自动释放该内存
 4.可以借用C++内存管理的经验来控制Objective-C的内存管理
 
  • MemoryDemo.h
     1 //  MemoryDemo.h
     2 //  MemoryTest
     3 //
     4 //  Created by arbboter on 14/11/28.
     5 //  Copyright (c) 2014ๅนด arbboter. All rights reserved.
     6 //
     7 
     8 #import <Foundation/Foundation.h>
     9 
    10 @interface MemoryDemo : NSObject
    11 {
    12     NSString*       _objectName;
    13     int             _objectCount;
    14 }
    15 
    16 -(void)setObjectName:(NSString*)name;
    17 -(NSString*)getObjectName;
    18 
    19 -(void)setObjectCount:(int)count;
    20 -(int)getObjectCount;
    21 
    22 -(void)showInfo;
    23 
    24 -(void)dealloc;

     

  • MemoryDemo.m

     1 //
     2 //  MemoryDemo.m
     3 //  MemoryTest
     4 //
     5 //  Created by arbboter on 14/11/28.
     6 //  Copyright (c) 2014年 arbboter. All rights reserved.
     7 //
     8 
     9 #import "MemoryDemo.h"
    10 
    11 @implementation MemoryDemo
    12 
    13 -(void)setObjectName:(NSString*)name
    14 {
    15     /* 对象重复不予重置 */
    16     if (name != _objectName)
    17     {
    18 #if 1
    19         /* 标准做法 */
    20         [name retain];
    21         [_objectName release];
    22         _objectName = [[NSString alloc] initWithString:name];
    23         [name release];
    24 #else
    25         /* 另一种思路,没想到会出什么问题 */
    26         [_objectName  release];
    27         _objectName = [name retain];
    28 #endif
    29         
    30     }
    31 }
    32 
    33 -(NSString*)getObjectName
    34 {
    35     return _objectName;
    36 }
    37 
    38 -(void)setObjectCount:(int)count
    39 {
    40     _objectCount = count;
    41 }
    42 -(int)getObjectCount
    43 {
    44     return _objectCount;
    45 }
    46 -(void)showInfo
    47 {
    48     NSLog(@"name = %@, count = %d", [self getObjectName], [self getObjectCount]);
    49 }
    50 
    51 -(void)dealloc
    52 {
    53     [_objectName release];
    54     [super dealloc];
    55 }
    56 
    57 @end

     

  • main.m

     1 //
     2 //  main.m
     3 //  MemoryTest
     4 //
     5 //  Created by arbboter on 14/11/28.
     6 //  Copyright (c) 2014年 arbboter. All rights reserved.
     7 //
     8 
     9 #import <Foundation/Foundation.h>
    10 #import "MemoryDemo.h"
    11 int main(int argc, const char * argv[])
    12 {
    13     NSString* name = [[NSString alloc] initWithString:@"Man of pig's feet"];
    14     NSString* nullName = nil;
    15     MemoryDemo* mem = [[MemoryDemo alloc] init];
    16     
    17     /* nil 允许retian,也允许release */
    18     [nullName retain];
    19     [mem setObjectName:name];
    20     [mem setObjectCount:18];
    21     [mem showInfo];
    22     
    23     // release
    24     [name release];
    25     /* nil 允许retian,也允许release */
    26     [nullName release];
    27     
    28     // OK!
    29     [mem showInfo];
    30     
    31     [mem release];
    32 
    33 #if 0
    34     /* error, mem's value is not nil but
    35      * mem's retain count alreadly to be 0
    36      */
    37     [mem release];
    38 #endif
    39     
    40     return 0;
    41 }
    42 
    43 /**
    44  * 内存管理原则:
    45  * 1.谁使的引用计数增加,那他也要负责对应的引用计数减少(类似C++,谁new谁delete)
    46  * 2.可以对nil的对象release(类似c++允许delete的对象为NULL一样)
    47  * 3.当对象引用计数为0时,系统会自动释放该内存
    48  * 4.可以借用C++内存管理的经验来控制Objective-C的内存管理
    49  */

     

posted on 2014-11-28 16:09  街角_祝福  阅读(210)  评论(0编辑  收藏  举报