NSMutableArray,NSMutableDictionary的内存管问题

今天做项目遇到一个问题,在一个类中定义了一个可变数组,使用的是copy的内存管理策略

当往数组中添加包装好的基本数据的时候,程序直接崩溃了。解决方法:把copy换成strong就不会崩溃了;

后来做了个测试,并没有很清楚问题出在哪里,如果有人知道请指教

新建一个工程 Single View Application

新建一个Pesrson类

Person.h

@interface Person : NSObject

@property (nonatomic, copy) NSMutableArray *testArr;
@property (nonatomic , copy) NSMutableDictionary *testDic;

@end

Person.m

@implementation Person

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.testArr = [NSMutableArray array];
        self.testDic = [NSMutableDictionary dictionary];
    }
    return self;
}

@end

ViewController.m

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    Person *person = [[Person alloc] init];

    [person.testArr addObject:[NSValue valueWithCGRect:CGRectZero]];

}

@end

运行后程序崩溃,

reason: ‘-[__NSArray0 addObject:]: unrecognized selector sent to instance 0x7f83b25009f0

只要是向可变字典/可变数组 中添加NSValue类型的对象,都会出现这种情况;

然后我新建了一个Command Line Toll

同样新建一个Person类做同样的测试(使用copy的内存管理策略)

main.m

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Person *p1 = [[Person alloc] init];
        [p1.testArr addObject:[NSValue valueWithRect:CGRectZero]];
        NSLog(@"%@",p1.testArr);
    }
    return 0;
}

打印结果

2016-01-21 00:17:42.953 test[1465:80006] (

    "NSRect: {{0, 0}, {0, 0}}"

)

可以正常打印,一直没明白这当中问题出在哪里,如果有人知道请指教

时间: 2024-10-23 02:29:00

NSMutableArray,NSMutableDictionary的内存管问题的相关文章

JSPatch实现原理详解<二>

本文转载至 http://blog.cnbang.net/tech/2855/ 距离上次写的<JSPatch实现原理详解>有一个月的时间,在这段时间里 JSPatch 在不断地完善和改进,代码已经有很多变化,有一些修改值得写一下,作为上一篇的补充. Special Struct 先说下 _objc_msgForward,在上一篇提到为了让替换的方法走 forwardInvocation,把它指向一个不存在的 IMP: class_getMethodImplementation(cls, @se

用法总结:NSArray,NSSet,NSDictionary-备用

Foundation framework中用于收集cocoa对象(NSObject对象)的三种集合分别是: NSArray 用于对象有序集合(数组)NSSet 用于对象无序集合      (集合)NSDictionary用于键值映射(字典)以上三种集合类是不可变的(一旦初始化后,就不能改变) 以下是对应的三种可变集合类(这三种可变集合类是对应上面三种集合类的子类):NSMutableArrayNSMutableSet  可修改的集合.主要用于集合运算(并集,交集,差集)NSMutableDict

提升自己逼格的编程之美之代码规范

原文 头文件#import的顺序(商量) 写法模板 #import <系统库> #import <第三方库> #import "其他类" 尽量按照先系统类 第三方类 自己写的类顺序导入 中间不能有空格 建议的写法 ? ? 不建议的写法 @Class的写法 写法模板:@class class1, class2; 建议的写法 ? ? 不建议的写法 ? ? @Interface的写法 写法模板 @interface 类名 : 父类 <协议1, 2="&

NSDictionary &#160;NSSet和NSArray的区别

Foundation framework中用于收集cocoa对象(NSObject对象)的三种集合分别是: NSArray 用于对象有序集合(数组) NSSet 用于对象无序集合      (集合) NSDictionary用于键值映射(字典) 以上三种集合类是不可变的(一旦初始化后,就不能改变) 以下是对应的三种可变集合类(这三种可变集合类是对应上面三种集合类的子类): NSMutableArray NSMutableSet  可修改的集合.主要用于集合运算(并集,交集,差集) NSMutab

JSPatch 实现原理详解

原文地址https://github.com/bang590/JSPatch/wiki/JSPatch-%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86%E8%AF%A6%E8%A7%A3 JSPatch 是一个 iOS 动态更新框架,只需在项目中引入极小的引擎,就可以使用 JavaScript 调用任何 Objective-C 原生接口,获得脚本语言的优势:为项目动态添加模块,或替换项目原生代码动态修复 bug. 之前在博客上写过两篇 JSPatch 原理解析文章(1 

OC蜕变第八天

七 字符串与基本数据类型转换 获取字符串的每个字符/字符串和其他数据类型转换 八 NSMutableString 基本概念/常用方法 九 NSArray NSArray基本概念/创建方式/注意事项/常用方法简写形式/遍历/排序/文件读写/NSArray 与字符串 十 NSMutableArray 概念/基本用法/错误用法 十一 NSDictionary 基本概念/创建/遍历/文件操作 十二 NSMutableArray NSMutableDictionary 基本概念/常用方法/简写/NSDic

iOS中常见 Crash 及解决方案

一.访问了一个已经被释放的对象 在不使用 ARC 的时候,内存要自己管理,这时重复或过早释放都有可能导致 Crash. 例子 NSObject * aObj = [[NSObject alloc] init]; [aObj release]; NSLog(@"%@", aObj); 原因 aObj 这个对象已经被释放,但是指针没有置空,这时访问这个指针指向的内存就会 Crash. 解决办法 使用前要判断非空,释放后要置空.正确的释放应该是: [aObj release]; aObj =

iOS 中的 HotFix 方案总结详解

相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dynamic Framework(Apple) React Native(Facebook) JSPatch(Tencent) WaxPatch WaxPatch是一个通过Lua语言编写的iOS框架,不仅允许用户使用 Lua 调用 iOS SDK和应用程序内部的 API, 而且使用了 OC runtime 特性调用替换应用程序内部由 O

[OC Foundation框架 - 17] copy语法

一个对象使用copy或mutableCopy方法可以创建对象的副本 1.copy 需要实现NSCopying协议 创建出来的是不可变副本,如NSString, NSArray, NSDictionary (1)不可变对象调用copy  (NSSring除外) 不会产生新的对象,而是返回对象本身,相当于retain,计数器+1 属于浅拷贝 1 NSArray *arr1 = [NSArray arrayWithObjects:@"张三", @"李四", nil]; 2