首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

NSMutableArray只将Object添加为指针?

在Objective-C中,NSMutableArray可以存储对象的指针。当你向NSMutableArray中添加对象时,实际上是将对象的指针添加到数组中。这意味着,当你向数组中添加对象时,你实际上是在存储对象的引用,而不是对象本身。

这种方式的好处是,当你向数组中添加对象时,不会创建对象的副本。这在处理大型对象或对象集合时非常有用,因为它可以节省内存和处理时间。但是,这也意味着,如果你修改了数组中的对象,那么在数组中存储的对象指针也会被修改。

例如,如果你有一个NSMutableArray,其中包含多个NSNumber对象,如下所示:

代码语言:objective-c
复制
NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, nil];

当你修改数组中的某个对象时,比如将@2修改为@4

代码语言:objective-c
复制
[array replaceObjectAtIndex:1 withObject:@4];

原始数组将被修改为@[@1, @4, @3]

总之,NSMutableArray只将对象添加为指针是一种节省内存和提高性能的方法。但是,这也意味着,当你修改数组中的对象时,原始对象也会被修改。如果你希望建立对象的副本,而不仅仅是指针,你可以使用NSMutableArraycopy方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Objective-C 内存管理(上)学习笔记

一.开篇之初 内存管理解决的问题就是: 1)防止野指针的生成 (野指针:指向变量的指针还存在,但是所指向的内存已经被释放,此时的指针就变成了野指针 -- 没有指向 “ 内容 ” 的指针) 2)...initializers instead"); + (instancetype)alloc OBJC_SWIFT_UNAVAILABLE("use object initializers instead...autorelease方法 问题 5:MRC下如何防止野指针访问? 野指针访问:指向的内存空间已经被释放了,但是指针还指向着已经被释放的内存,此时的指针就是野指针。...代码: /** * alloc就是分配内存的意思,返回了一个指向内存首地址的指针 */ NSMutableArray *mArrayAlloc = [[NSMutableArray...- (id)copy * Returns the object returned by copyWithZone:

79220
  • 透彻理解 NSNotificationCenter 通知

    让不希望继续接受通知的响应者失去对该通知的响应; 2、避免重复添加相同通知(响应者的内存为同一块的时候); 3、通知中心对响应者observer是使用unsafe_unretained修饰,当响应者释放会出现野指针...,向野指针发送消息造成崩溃;在iOS 9(更新的系统版本有待考证)之后,苹果对其做了优化,会在响应者调用dealloc方法的时候执行removeObserver:方法。...前面也说过,通知中心对响应者observer是使用unsafe_unretained修饰,当响应者释放会出现野指针,如果向野指针发送消息造成崩溃。...*tempArr = [NSMutableArray array]; [tempArr addObject:observerInfo]; [observersDic...*tempArr = [NSMutableArray array]; [tempArr addObject:observerInfo]; [observersDic

    2.4K70

    深入浅出 Runtime(一):初识

    举例 对于 NSString *string = [[NSMutableArray alloc]init]; 编译时:编译器进行类型检查的时候,由于给一个NSString类型的指针赋值的是一个NSMutableArray...但是编译器会将 string当作NSString的实例,所以string对象调用NSString的方法,编译没有任何问题,而调用NSMutableArray的方法,编译会直接报错。...运行时:由于string实际上是指向一个NSMutableArray对象,NSMutableArray对象没有stringByAppendingString:方法,所以导致crash:unrecognized...(id obj) // 设置 isa 指向的 Class Class object_setClass(id obj, Class cls) // 判断一个 OC 对象是否为 Class BOOL object_isClass..., const void * key) // 移除指定 object 的所有关联对象 void objc_removeAssociatedObjects(id object) Runtime 都有哪些应用

    1K20

    iOS小技能(开发规范): weak和strong修饰符的规范使用

    I weak &strong __weak 表示弱引用 Assigning retained object to weak variable; object will be released after...1.3 weak和strong的不同 当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。...一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。 例子: 想象我们的对象是一条狗,狗想要跑掉(被释放)。  strong型指针就像是栓住的狗。...如果有5个人牵着一条狗(5个strong型指针指向1个对象),除非5个牵绳都脱落 ,否着狗是不会跑掉的。 weak型指针就像是一个小孩指着狗喊到:“看!...(manage a modifiable array of objects) NSMutableArray *arrayImage = [NSMutableArray array];//Creates

    91150

    ARC内存管理中容易忽略的问题

    1.2、字符串的isa (1)NSTaggedPointerString   NSTaggedPointerString 用指针地址的富余位存储当前变量值,若对象指针的最低有效位为1(即奇数),则该指针为...= [array copy]; NSMutableArray *mCopyArray = [array mutableCopy]; NSLog(@"array = %p", array...2.3、浅拷贝与深拷贝 对象拷贝有两种方式:浅拷贝(指针复制)和深拷贝(内容复制),浅拷贝,并不拷贝对象内容,仅仅是拷贝指向对象的指针;深拷贝是直接拷贝整个对象内容到另一块内存中。...+ (instancetype)dictionaryWithObject:(ObjectType)object forKey:(KeyType )key; 为了保证这个特性在NSDcitionary...中对key的内存管理为copy,在复制的时候需要考虑对系统的负担,因此key应该是轻量级的,所以通常我们都用字符串和数字来做索引,但这只能说是key-to-object映射,不能说是object-to-object

    98220

    iOS中Block的用法,举例,解析与底层原理(这可能是最详细的Block解析)

    也可以通过指针调用函数,看起来没用到函数名: int result = (*funcptr)(10); 实际,在赋值给函数指针时,必须通过函数的名称才能获得该函数的地址。...) autoreleasepool{} __weak __typeof__(object) weak##_##object = object; #else #define weakify(object)...; #else #define weakify(object) try{} @finally{} {} __block __typeof__(object) block##_##object = object...(object) try{} @finally{} __typeof__(object) object = weak##_##object; #else #define strongify(object...,也就是block的类型 Flags,标志变量,在实现block的内部操作时会用到 Reserved,保留变量 FuncPtr,block执行时调用的函数指针 可以看出,它包含了isa指针(包含isa指针的皆为对象

    1.8K30

    KVO详解(一)

    我们在定义中可以看到,context的类型是void *,这是一个C语言中的指针类型,而C语言中的空指针是使用NULL来表示的。nil表示的是OC中的实例对象的空指针。...共同来确定变化的来源 } 通过keyPath和object来确定变化的来源其实是不优雅的。...但是当一个实例对象被使用KVO观测之后,这个被观测的实例对象中的isa指针就会被修改,被修改后的isa指针就不再指向原来真正的类的内存地址了,而是指向了一个中间类的内存 因此,决不能使用isa指针来确定实例对象的类...需要说明一下的是,通过object_getClassName(self.person)获取到的就是self.person这个实例对象里面的isa指针指向的那个类;而通过self.person.class...isa的指回以及动态子类的销毁 在某个对象被KVO观测之后,该对象的isa指针会被修改。那么,这个isa指针的修改会被一致保留吗?isa指针被修改了之后会再被改回来吗? 答案是会的。

    76031

    iOS 复制知识点总结

    2016-03-10 17:32:04.481 Homework[21715:2353641] 0x17006fe40 通过查看内存,可以看到stringCopy和string的地址是一样,进行了指针拷贝...说明copy操作进行了指针拷贝,mutableCopy进行了内容拷贝。但需要强调的是:此处的内容拷贝,仅仅是拷贝array这个对象,array集合内部的元素仍然是指针拷贝。...我们继续往下, mutableCopy NSMutableArray *array = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString...同时需要注意的是如果对象中有其他指针类型的实例变量,且只是简单的赋值操作:person.obj2 = self.obj2,其中obj2是另一个自定义类,如果我们修改obj2中的属性,我们会发现复制后的person...Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to mutate immutable object

    682110

    iOS 启动优化--二进制重排

    Map LinkMap是iOS编译过程的中间产物,记录了二进制文件的布局,通过在Xcode的Build Setting中设置Write Link Map File = YES开启,主要包含下面三个部分 Object...guard) {} __sanitizer_cov_trace_pc_guard_init(uint32_t *start,uint32_t *stop)方法记录了符号数量 参数1start是一个指针...,指向无符号的int类型,占4字节,相当于一个数组的起始位置,从高位往低位读取 参数2stop也是一个指针,因为数据是高位往低位读取,此时的&stop的地址并不是其真实地址,因为stop占了4个字节,所以...malloc(sizeof(YPNode)); *node = (YPNode){PC, NULL}; //加入队列 //符号的访问不是通过下标访问,是通过链表的next指针...malloc(sizeof(YPNode)); *node = (YPNode){PC, NULL}; //加入队列 //符号的访问不是通过下标访问,是通过链表的next指针

    1.3K60

    KVO详解(二)

    然后在分类中去增加一个自定义的添加观察者的方法,在该方法中,大致是做三件事情: 验证观察的keyPath是否有对应的setter方法,有的话才会进行下一步 创建一个中间类 修改实例对象的isa指针的指向...我们前面提到,当一个对象在被KVO监测之后,其isa指针会指向一个新的中间子类,因此,在移除KVO观测的时候,我们就需要将isa给指回来: ?...setter;②通过遍历对照keypath,找到当前变化的所有监听者,并给这些监听者发送一个监听到变化的消息,使之在外界对变化进行响应 3,isa-swizzling 将当前被KVO监听的实例对象的isa指针修改为指向中间子类...移除观察者 里面做的最重要的一件事就是将实例对象的isa指针的指向给改回来。 自定义KVO优化——函数式编程 现在各位想一下,我们实现一个KVO的监听,需要做哪些步骤呢?...OBJC_ASSOCIATION_RETAIN_NONATOMIC); break; } if (observerArr.count<=0) { // 将isa指针指回中间子类的父类

    71331
    领券