NSPointerArray的用处

NSPointerArray的用处

 

1. 说明

也许你对NSArray使用了如指掌,每个加入到NSArry的对象都会被NSArray持有.有时候,这种特性不是我们想要的结果.

有时候,我们想将对象存储起来,但是不想让数组增加了这个对象的引用计数,这个时候,NSPointArray才是你想要的.

 

2. 源码

https://github.com/YouXianMing/NSPointerArrayExample

//
//  WeakMutableArray.h
//  NSPointerArray
//
//  Created by YouXianMing on 15/6/5.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface WeakMutableArray : NSObject

/**
 *  获取所有有效的对象
 */
@property (nonatomic, strong, readonly)  NSArray    *allObjects;

/**
 *  数组中有用对象的个数
 */
@property (nonatomic, readonly)          NSInteger   usableCount;

/**
 *  数组中所有对象的个数(包括NULL)
 */
@property (nonatomic, readonly)          NSInteger   allCount;

/**
 *  添加对象
 *
 *  @param object 被添加对象
 */
- (void)addObject:(id)object;

/**
 *  获取数组中的对象(可以获取到NULL对象)
 *
 *  @param index 数组下标
 *
 *  @return 对象
 */
- (id)objectAtWeakMutableArrayIndex:(NSUInteger)index;

@end
//
//  WeakMutableArray.m
//  NSPointerArray
//
//  Created by YouXianMing on 15/6/5.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "WeakMutableArray.h"

@interface WeakMutableArray ()

@property (nonatomic, strong) NSPointerArray  *pointerArray;

@end

@implementation WeakMutableArray

- (instancetype)init {

    self = [super init];
    if (self) {
        [self setup];
    }
    return self;
}

- (void)setup {
    self.pointerArray = [NSPointerArray weakObjectsPointerArray];
}

- (void)addObject:(id)object {
    [self.pointerArray addPointer:(__bridge void *)(object)];
}

- (id)objectAtWeakMutableArrayIndex:(NSUInteger)index {
    return [self.pointerArray pointerAtIndex:index];
}

#pragma mark - 重写getter方法
@synthesize allObjects = _allObjects;
- (NSArray *)allObjects {
    return self.pointerArray.allObjects;
}

@synthesize usableCount = _usableCount;
- (NSInteger)usableCount {
    return self.pointerArray.allObjects.count;
}

@synthesize allCount = _allCount;
- (NSInteger)allCount {
    return self.pointerArray.count;
}

@end

3. 细节

时间: 2024-09-22 20:48:39

NSPointerArray的用处的相关文章

Excel中的双击的用处有哪些

  Excel中的双击的用处有哪些?鼠标双击在Excel中究竟有多大作用,来看了你就知道了! 1. 巧分窗口 如果仔细观察可能会发现,在Excel垂直滚动条上方与带黑三角形按钮相邻的地方,有一个折叠起来的按钮,双击(以下双击均指双击鼠标左键)它,即可将当前窗口上下一分为二;双击水平滚动条右方的折叠起来的按钮,可将当前窗左右一分为二. 2. 调整列宽 单元格内的文本或数字在列宽不够时,超出宽度部分不显示或显示为#,这时可将鼠标指向此列列标右边界线,待鼠标指针变成左右的双向箭头时双击,可得到最适合的

做SEO时Nofollow的一个误区和巧妙用处

在正式进入主题前,先简单介绍下这个nofollow怎么使用,相信还有部分做SEO的朋友对这个标签的使用不太了解的: a target="blank" href="ABC" rel="nofollow" >XXX 具体用处是什么呢?在写本文之前,我的理解跟很多人一样,加入nofollow标签是为了控制权重,即不让所在页面的权重传递给目标页面,这样一来,就相对地增加了传递给其他页面的权重. 这种观念从我在温州网络公司做SEO时,就一直深埋在我脑

ISupportInitialize接口的用处

我最近才发现ISupportInitialize这个接口.在开发复杂一点的winform控件的时候它实在是很有用. MSDN上有对ISupportInitialize的介绍,我这里只说一下在什么情况下用它发挥作用. 问题 我要做一个比较复杂的控件"OpenGLControl",它能够在winform程序中执行opengl命令,渲染出3D场景.这个控件有一些相关的属性,在设计器里,这些属性是这样写(自动生成)的: // // openGLControl1 // this.openGLCo

C#进行Visio二次开发之Shape的Data1、Data2、Data3的用处

我们知道,Visio的Shape对象有有3个比较特别的属性,分别是Data1.Data2.Data3,平常我们很少用到它,因为我们如果需要属性的话,可能会通过ShapeSheet的Customed Properties中定义我们所需要的信息,需要各种属性的值都可以拿到,那么Data1.Data2.Data3对我们来说,就用处不大,但有的情况下,我们使用它进行一些操作却是非常方便的. 首先我们介绍下,这几个属性是什么东西,Data1.Data2.Data3是Shape的内置属性,不需要额外定义,而

键盘F1~F12的用处

键盘F1-F12的用处 所有的键盘都至少有12个功能键,通常被称为F键,其位置一般是在键盘顶部,从F1到F12.不过你知道所有这些键的作用吗?你知道这些键怎样为你节省时间吗? F1:如果你处在一个选定的程序中而需要帮助,那么请按下F1.如果现在不是处在任何程序中,而是处在资源管理器或桌面,那么按下F1就会出现Windows的帮助程序.如果你正在对某个程序进行操作,而想得到Windows帮助,则需要按下Win+F1.按下Shift+F1,会出现"What's This?"的帮助信息. F

系统的安全模式到底有何用处

很多人在遇到问题的时候,别人都是建议你去安全模式下,然后怎么样怎么样.很多人就会郁闷的说为什么要去安全模式呢?其他模式不可以吗?安全模式到底有什么特殊的,这些疑问都会在下面的内容帮你解决. 1 安全模式的特殊功能: 1:删除顽固文件 2:查杀病毒 3:解除组策略锁定 2 有利于我们删除顽固文件 顽固文件在我们要删除的时候通常是提示,某某进程在使用或者直接提示系统文件.但是有点时候你很确定它不是系统问题,或者你根本不知道那个进程在使用它.这时候我们可以通过进入安全模式,把这些残留.顽固文件轻松删除

电脑键盘多功能键的用处和技巧

  电脑标准键盘上那么多键,您都知道是做什么用的么?您又能了解几个多功能键的用处呢?本文详细的为您介绍这些键盘多功能键的用处. 1.Win键 也就是飘着Microsoft Windows大旗的那个键,在键盘上有两个Windows键,分布在键盘的两侧 ,使用它再配合一些键能够简化一些操作.如: Win 打开或关闭任务栏"开始"菜单 Win+F 打开"查找"窗口 Win+M 最小化所有的窗口 Win+Shift+M 最大化所有的窗口 Win+E 启动Windows&qu

做一个饲养员给动物喂食物的例子体现JAVA中的面向对象思想,接口(抽象类)的用处

做一个饲养员给动物喂食物的例子体现JAVA中的面向对象思想,接口(抽象类)的用处 interface Animal{             //动物的接口    public void eat(Food food); //接口中只有抽象的方法和静态常量!这里void前面省略了abstract.同样,变量可以省略static final} class Cat implements Animal //一种动物类:猫  {      public void eat(Food food) //这里是对

c++-栈处理括号表达式,有个变量不知道什么用处

问题描述 栈处理括号表达式,有个变量不知道什么用处 这是一段利用栈处理括号表达式的程序: 1. 当你看到一个左括号,直接入栈: 2. 看到一个右括号,从stack总pop对象,直到遇到左括号,左括号也pop出栈. 3. 然后将一个值作为运算结果存入栈中. 题目来源于C++ Primer,给的程序如下. 问题: 1.这里有个变量seen记录了有多少个括号,但是这个seen有什么用? 2.expr这个变量,定义为什么要定义成引用? int main() { auto& expr = "Thi