zoukankan      html  css  js  c++  java
  • 第五讲:ObjC 内存管理3 自定义MyArray

    转:http://tigercat1977.blog.163.com/blog/static/2141561122012111294042162/

    第五讲:Obj-C 内存管理3 - 自定义MyArray 

    2012-12-12 09:40:42|  分类: Objective-C |  标签:objective-c  |字号 订阅

    主要内容
          了解 NSMutableArray 如何实现
          进一步深入内存管理
          进一步深入内存管理!
          进一步深入内存管理!!
          进一步深入内存管理!!!

    NSMutableArray 典型用法
          NSMutableArray *array = [[NSMutableArray alloc] init];
          for (int i = 0; i < 10; i++)
          {
                Dog *dog = [[Dog alloc] init];
                [dog setID:i];
                [array addObject:dog];
                [dog release];
          }
          for (Dog *d in array)
          {
                NSLog(@"dog is %d", [d ID]);
          }
          [array release];

    MyArray 提供方法
          - (NSInteger) addObject:(id)object;     // 往类里面加个对象                   
          - (id) objectAtIndex:(NSUInteger) index;    // 取得第几项的对象
          - (void) removeObjectAtIndex:(NSUInteger) index;  // 删掉某一项
          - (void) removeAll;   //删掉所有的对象

    举例子 (四条狗)

    // Dog.h #import <Foundation/Foundation.h> @interface Dog : NSObject { int _ID; } @property (assign) int ID; @end

    // Dog.m #import "Dog.h" @implementation Dog @synthesize ID = _ID; // 当对象计数器到 0 的时候 自动会调用 - (void) dealloc { NSLog(@"dog id %d dealloc", _ID); [super dealloc]; } @end

    // main.m #import <Foundation/Foundation.h> #import "Dog.h" int main (int argc, const char * argv[]) { @autoreleasepool { NSLog(@"Hello, World!"); NSMutableArray *array = [[NSMutableArray alloc] init]; for (int i =0; i < 4; i++) { Dog *d = [[Dog alloc] init]; [d setID:i]; NSLog(@"dog%i retainCount1 %ld", i, [d retainCount]); [array addObject:d]; NSLog(@"dog%i retainCount2 %ld", i, [d retainCount]); [d release]; } [array release]; } return 0; } /* 输出结果: Hello, World! dog0 retainCount1 1 dog0 retainCount2 2 dog1 retainCount1 1 dog1 retainCount2 2 dog2 retainCount1 1 dog2 retainCount2 2 dog3 retainCount1 1 dog3 retainCount2 2 dog id 0 dealloc dog id 1 dealloc dog id 2 dealloc dog id 3 dealloc */


    ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
    举例子 (用 MyArray 提供方法)

    // Dog.h #import <Foundation/Foundation.h> @interface Dog : NSObject { int _ID; } @property (assign) int ID; @end

    // Dog.m #import "Dog.h" @implementation Dog @synthesize ID = _ID; // 当对象计数器到 0 的时候 自动会调用 - (void) dealloc { NSLog(@"dog id %d dealloc", _ID); [super dealloc]; } @end


    // MyArray.h #import <Foundation/Foundation.h> @interface MyArray : NSObject { NSUInteger _count; // 数组当前有几项元素 id _objs[512]; // 创建了一个 512 项的数组 4*512 } @property (assign, readonly) NSUInteger count; // 往 MyArray 中加入一项元素 - (void) addObject:(id) object; // 取得第 index 项元素 - (id) objectAtIndex:(NSUInteger) index; // 删除第 index 项元素 - (void) removeObjectAtIndex:(NSUInteger) index; // 删除所有元素 - (void) removeAll; @end

    // MyArray.m #import "MyArray.h" @implementation MyArray @synthesize count = _count; - (id) init { self = [super init]; if (self) { _count = 0; } return self; } - (void) addObject:(id) object { if (_count >= 512) return; _objs[_count] = [object retain]; _count++; // 这里必须要做 [object retain]; } - (id) objectAtIndex:(NSUInteger)index { return _objs[index]; } - (void) removeObjectAtIndex:(NSUInteger)index { id obj = _objs[index]; [obj release]; _objs[index] = nil; } - (void) removeAll { for (int i =0; i < _count; i++) { [self removeObjectAtIndex:i]; } } - (void) dealloc { // 在数组对象被 release 到 0 时候调用 NSLog(@"before remove all"); [self removeAll]; NSLog(@"after remove all"); [super dealloc]; } @end


    // main.m #import <Foundation/Foundation.h> #import "Dog.h" #import "MyArray.h" int main (int argc, const char * argv[]) { @autoreleasepool { NSLog(@"Hello, World!"); MyArray *myArray = [[MyArray alloc] init]; for (int i = 0; i < 4; i++) { Dog *d = [[Dog alloc] init]; [d setID:i]; NSLog(@"dog%i retainCount1 is %ld", i, [d retainCount]); [myArray addObject:d]; NSLog(@"dog%i retainCount2 is %ld", i, [d retainCount]); [d release]; } [myArray release]; } return 0; } /* 输出结果: Hello, World! dog0 retainCount1 1 dog0 retainCount2 2 dog1 retainCount1 1 dog1 retainCount2 2 dog2 retainCount1 1 dog2 retainCount2 2 dog3 retainCount1 1 dog3 retainCount2 2 dog id 0 dealloc dog id 1 dealloc dog id 2 dealloc dog id 3 dealloc */


    (本讲完)
  • 相关阅读:
    memcached命令
    模块管理常规功能自己定义系统的设计与实现(14--模块图表分析的设计)
    [易飞]凭证设计扩展字段之内容-文字显示格式
    将替代ListView的RecyclerView 的使用(一)
    POJ 2049— Finding Nemo(三维BFS)10/200
    最好用的jquery列表拖动排列(由项目提取)
    编程算法
    java几个easy出错的小程序
    GoldenGate配置(三)之DDL复制配置
    aused by: org.apache.xmlbeans.SchemaTypeLoaderException: XML-BEANS compiled schema: Incompatible min
  • 原文地址:https://www.cnblogs.com/jackljf/p/3589251.html
Copyright © 2011-2022 走看看