欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

iOS 數(shù)據(jù)結(jié)構(gòu)之數(shù)組的操作方法

 更新時間:2018年07月23日 17:13:42   投稿:mrr  
這篇文章主要介紹了iOS 數(shù)據(jù)結(jié)構(gòu)之數(shù)組的操作方法,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧

數(shù)組是線性結(jié)構(gòu)是容器類型,是一塊連續(xù)的內(nèi)存空間, iOS 中用 NSArray 和 NSMutableArray 集合類型,用來存放對象類型,其中 NSArray是不可變類型, NSMutableArray 是可變類型,能夠?qū)?shù)組中元素進行增刪改查.

本文作者本著學習的態(tài)度,決定仿照NSArray和NSMutableArray 自己實現(xiàn)一個數(shù)組類型,當然性能可能沒有 NSArray和NSMutableArray 的好,插入100000萬條數(shù)據(jù),時間上是 NSMutableArray 的三倍左右 ,當然平時使用過程中很少100000次這樣大的數(shù)據(jù)往數(shù)組里添加,因此性能方面可以忽略.

ArrayList.h 主要方法聲明 完全照搬 NSArray 和 NSMutableArray 的方法名稱

 

先發(fā)下測試結(jié)果

dispatch_async(dispatch_get_global_queue(0, 0), ^{
    Person *p1 = [[Person alloc] init];
    NSMutableArray *array = [NSMutableArray arrayWithCapacity:100000];
//   ArrayList 
  *array = [ArrayList arrayWithCapacity:100000];
    CFAbsoluteTime startTime =CFAbsoluteTimeGetCurrent();
    for (int i = 0; i<100000; i++) {
      [array addObject:p1];
    }
    CFAbsoluteTime linkTime = (CFAbsoluteTimeGetCurrent() - startTime);
    CFTimeInterval duration = linkTime * 1000.0f;
    NSLog(@"Linked in %f ms",duration);
    [self->_timeArray addObject:@(duration)];
    count++;
  });
NSMutableArray 5.081740292635832 ms
ArrayList 16.27591523257168 ms
以下是 ArrayList 的具體實現(xiàn) ,內(nèi)部是一個 C語言的數(shù)組用來存放對象
//
// ArrayList.m
// ArrayList
//
// Created by dzb on 2018/7/19.
// Copyright © 2018 大兵布萊恩特. All rights reserved.
//
#import "ArrayList.h"
static NSInteger const defaultCapacity = 10;
typedef void * AnyObject;
@interface ArrayList ()
{
  AnyObject *_array;
  NSInteger _size;
  NSInteger _capacity;
}
@end
@implementation ArrayList
#pragma mark - init
- (instancetype)init
{
  self = [super init];
  if (self) {
    [self resetArray];
  }
  return self;
}
+ (instancetype)array {
  return [[ArrayList alloc] initWithCapacity:defaultCapacity];
}
+ (instancetype)arrayWithCapacity:(NSUInteger)numItems {
  return [[ArrayList alloc] initWithCapacity:numItems];
}
- (instancetype)initWithCapacity:(NSUInteger)numItems {
  _capacity = numItems;
  _array = calloc(_capacity,sizeof(AnyObject));
  _size = 0;
  return self;
}
/**
 數(shù)組重置
 */
- (void) resetArray {
  _size = 0;
  if (_array != NULL)
    _array[_size] = NULL;
    free(_array);
  _capacity = defaultCapacity;
  _array = calloc(_capacity, sizeof(AnyObject));
}
#pragma makr - 增加操作
- (void)addObject:(id)anObject {
  [self insertObject:anObject atIndex:_size];
}
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index {
  if (!anObject) {
    @throw [NSException exceptionWithName:@"add object null." reason:@"object must be not null ." userInfo:nil];
    return;
  }
  ///判越界
  if ((index > _size)) {
    @throw [NSException exceptionWithName:@"Array is out of bounds" reason:@"out of bounds" userInfo:nil];
    return;
  }
  if (_size == _capacity-1) { ///判斷原來數(shù)組是否已經(jīng)滿了 如果滿了就需要增加數(shù)組長度
    [self resize:2*_capacity];
  }
  ///交換索引位置
  if (self.count > 0 ) {
    for(NSInteger i = _size - 1 ; i >= index ; i--)
      _array[i + 1] = _array[i];
  }
  self->_array[index] = (__bridge_retained AnyObject)(anObject);
  _size++;
}
#pragma mark - 刪除操作
- (void)removeAllObjects {
  NSInteger i = _size-1;
  while (_size > 0) {
    [self removeObjectAtIndex:i];
    i--;
  }
  [self resetArray];
}
- (void)removeObjectAtIndex:(NSUInteger)index {
  ///判斷越界
  if ((index > _size)) {
    @throw [NSException exceptionWithName:@"Array is out of bounds" reason:@"out of bounds" userInfo:nil];
    return;
  }
  AnyObject object =(_array[index]);
  CFRelease(object);
  for(NSInteger i = index + 1 ; i < _size ; i ++)
    _array[i - 1] = _array[i];
  _size--;
  _array[_size] = NULL;
  ///對數(shù)組空間縮減
  if (_size == _capacity/2) {
    [self resize:_capacity/2];
  }
}
- (void)removeObject:(id)anObject {
  NSInteger index = [self indexOfObject:anObject];
  if (index == NSNotFound) return;
  [self removeObjectAtIndex:index];
}
- (void)removeLastObject {
  if ([self isEmpty]) return;
  [self removeObjectAtIndex:_size-1];
}
#pragma mark - 修改操作
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject {
  if (!anObject) {
    @throw [NSException exceptionWithName:@"add object null." reason:@"object must be not null ." userInfo:nil];
    return;
  }
  ///判斷越界
  if ((index > _size)) {
    @throw [NSException exceptionWithName:@"Array is out of bounds" reason:@"out of bounds" userInfo:nil];
    return;
  }
  _array[index] = (__bridge AnyObject)(anObject);
}
#pragma mark - 查詢操作
- (BOOL) isEmpty {
  return (self->_size == 0);
}
- (BOOL) isFull {
  return (self->_size == self->_capacity-1);
}
- (id)objectAtIndex:(NSUInteger)index {
  if ((index > _size)) {
    @throw [NSException exceptionWithName:@"Array is out of bounds" reason:@"out of bounds" userInfo:nil];
    return nil;
  }
  if ([self isEmpty]) { return nil; }
  AnyObject obj = _array[index];
  if (obj == NULL) return nil;
  return (__bridge id)(obj);
}
- (NSUInteger)indexOfObject:(id)anObject {
  for (int i = 0; i<_size; i++) {
    id obj = (__bridge id)(_array[i]);
    if ([anObject isEqual:obj]) return i;
  }
  return NSNotFound;
}
- (BOOL)containsObject:(id)anObject {
  for (int i = 0; i<_size; i++) {
    id obj = (__bridge id)(_array[i]);
    if ([anObject isEqual:obj]) return YES;
  }
  return NO;
}
- (id)firstObject {
  if ([self isEmpty]) return nil;
  return (__bridge id _Nullable)(_array[0]);
}
- (id)lastObject {
  if ([self isEmpty]) return nil;
  return (__bridge id _Nullable)(_array[_size]);
}
- (NSUInteger)count {
  return _size;
}
- (NSString *)description {
  NSMutableString *string = [NSMutableString stringWithFormat:@"\nArrayList %p : [ \n" ,self];
  for (int i = 0; i<_size; i++) {
    AnyObject obj = _array[i];
    [string appendFormat:@"%@",(__bridge id)obj];
    if (i<_size-1) {
      [string appendString:@" , \n"];
    }
  }
  [string appendString:@"\n]\n"];
  return string;
}
/**
 對數(shù)組擴容
 @param capacity 新的容量
 */
- (void) resize:(NSInteger)capacity {
  AnyObject *oldArray = _array;
  AnyObject *newArray = calloc(capacity, sizeof(AnyObject));
  for (int i = 0 ; i<_size; i++) {
    newArray[i] = oldArray[i];
  }
  _array = newArray;
  _capacity = capacity;
  free(oldArray);
}
- (void)dealloc
{
  if (_array != NULL)
    [self removeAllObjects];
  free(_array);
// NSLog(@"ArrayList dealloc");
}
@end

經(jīng)過測試 數(shù)組內(nèi)部會對存入的對象 進行 retain 操作 其引用計數(shù)+1 ,當對象從數(shù)組中移除的時候 能夠正常的使對象內(nèi)存引用計數(shù)-1,因此不必擔心對象內(nèi)存管理的問題. 數(shù)組默認長度是10 , 如果在開發(fā)者不確定數(shù)組長度時候 ,其內(nèi)部可以動態(tài)的擴容增加數(shù)組長度,當執(zhí)行 remove 操作時候 也會對數(shù)組內(nèi)部長度 進行相應的縮減

實現(xiàn)了 NSArray 和 NSMutableArray 等常用API,如果不是對性能特別在意的場景下 ,可以使用 ArrayList 來存放一些數(shù)據(jù)

相關文章

  • iOS中輸入框設置指定字符輸入的方法

    iOS中輸入框設置指定字符輸入的方法

    這篇文章主要給大家介紹了關于iOS中輸入框如何設置指定字符輸入的相關資料,其中介紹了關于只能輸入純數(shù)字、只能輸入純大小寫字母以及大小寫字母和數(shù)字結(jié)合輸入等指定字符的限制,需要的朋友可以參考借鑒,下面來一起看看吧。
    2018-01-01
  • iOS 通過collectionView實現(xiàn)照片刪除功能

    iOS 通過collectionView實現(xiàn)照片刪除功能

    這篇文章主要介紹了iOS 通過collectionView實現(xiàn)照片刪除功能,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-11-11
  • 詳解Objective C 中Block如何捕獲外部值

    詳解Objective C 中Block如何捕獲外部值

    這篇文章主要為大家介紹了詳解Objective C 中Block如何捕獲外部值實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • iOS開發(fā)之1行代碼實現(xiàn)緩存計算及清除緩存

    iOS開發(fā)之1行代碼實現(xiàn)緩存計算及清除緩存

    這篇文章主要給大家介紹了關于iOS開發(fā)之1行代碼實現(xiàn)緩存計算及清除緩存的相關資料,文中通過示例代碼介紹的非常詳細,對各位iOS開發(fā)者們具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-05-05
  • iOS DispatchSourceTimer 定時器的具體使用

    iOS DispatchSourceTimer 定時器的具體使用

    定時器在很多地方都可以用到,本文主要介紹了iOS DispatchSourceTimer 定時器的具體使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Xcode8打印一堆log問題的快速解決方法

    Xcode8打印一堆log問題的快速解決方法

    剛裝的xcode8,不知道從哪來的一堆log,很奇怪。怎么解決此問題呢?下面小編給大家分享本教程幫助大家了解Xcode8打印一堆log問題的快速解決方法,感興趣的朋友跟著小編一起學習吧
    2016-10-10
  • iOS中獲取系統(tǒng)相冊中的圖片實例

    iOS中獲取系統(tǒng)相冊中的圖片實例

    這篇文章主要介紹了iOS中獲取系統(tǒng)相冊中的圖片實例,具有一定的參考價值沒有需要的朋友可以了解一下。
    2016-11-11
  • iOS App中調(diào)用iPhone各種感應器的方法總結(jié)

    iOS App中調(diào)用iPhone各種感應器的方法總結(jié)

    Xcode環(huán)境中包含CoreMotion框架,能夠幫助我們調(diào)用硬件設備的加速度傳感器和陀螺儀等感應器,下面比較詳細地整理了iOS App中調(diào)用iPhone各種感應器的方法總結(jié),需要的朋友可以參考下:
    2016-07-07
  • iOS開發(fā)中控制屏幕旋轉(zhuǎn)的編寫方法小結(jié)

    iOS開發(fā)中控制屏幕旋轉(zhuǎn)的編寫方法小結(jié)

    這篇文章主要介紹了iOS開發(fā)中控制屏幕旋轉(zhuǎn)的編寫方法小結(jié),包括橫豎屏切換時視圖所出現(xiàn)的問題等經(jīng)常需要注意的地方,需要的朋友可以參考下
    2015-10-10
  • iOS中的UIKeyboard鍵盤視圖使用方法小結(jié)

    iOS中的UIKeyboard鍵盤視圖使用方法小結(jié)

    鍵盤視圖我們平時在做App的時候都要調(diào)用得到,這里我們就來整理一下iOS中的UIKeyboard鍵盤視圖使用方法小結(jié),需要的朋友可以參考下
    2016-06-06

最新評論