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}}"
)
可以正常打印,一直没明白这当中问题出在哪里,如果有人知道请指教
--------------------------------------------------------------已解决:
copy拷贝出来的是一个不可变数组,对它添加元素就会造成crash
NSMutableArray,NSMutableDictionary的内存管问题的更多相关文章
- iOS:小技巧(不断更新)
记录下一些不常用技巧,以防忘记,复制用. 1.获取当前的View在Window的frame: UIWindow * window=[[[UIApplication sharedApplication] ...
- iOS 中的 HotFix 方案总结详解
相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dynamic Framework(Ap ...
- 4.4 多线程进阶篇<下>(NSOperation)
本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人"简书" 本文源码 Demo 详见 Github https://github.c ...
- iOS中常见 Crash 及解决方案
来源:枫影JustinYan 链接:http://justinyan.me/post/1609 一.访问了一个已经被释放的对象 在不使用 ARC 的时候,内存要自己管理,这时重复或过早释放都有可能导致 ...
- JSPatch 实现原理详解
原文地址https://github.com/bang590/JSPatch/wiki/JSPatch-%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86%E8%AF%A6%E8 ...
- iOS 常见 Crash 及解决方案
一.访问了一个已经被释放的对象 在不使用 ARC 的时候,内存要自己管理,这时重复或过早释放都有可能导致 Crash. 例子 NSObject * aObj = [[NSObject alloc] i ...
- [OC Foundation框架 - 17] copy语法
一个对象使用copy或mutableCopy方法可以创建对象的副本 1.copy 需要实现NSCopying协议 创建出来的是不可变副本,如NSString, NSArray, NSDictionar ...
- 用法总结:NSArray,NSSet,NSDictionary-备用
Foundation framework中用于收集cocoa对象(NSObject对象)的三种集合分别是: NSArray 用于对象有序集合(数组)NSSet 用于对象无序集合 (集合)NS ...
- QQ空间掉帧率优化实战
商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. WeTest 导读 空间新业务需求日益增多,在业务开发阶段的疏忽,或者是受到其他业务的影响(比如一些非空间的业务网络回包或者逻辑在主线程 ...
随机推荐
- BFC引发的关于position的思考
BFC布局规则: 内部的Box会在垂直方向,一个接一个地放置. Box垂直方向的距离由margin决定.属于同一个BFC的两个相邻Box的margin会发生重叠 每个元素的margin box的左边, ...
- 关于TouchEvent中出现异常:MessageQueue-JNI问题
Tag:MessageQueue-JNI Exception dispatching input event. Exception in MessageQueue callback: handleRe ...
- 牛客OJ——[编程题]A+B和C__如何输入多组测试数据(测试OK)
几个要注意的地方: (1)Java OJ,必须将类名写成Main (2)关于如何输入多组测试数据,用二维数组去存储是一个方法,直接在while里面做也可以 但是如果 (3)关于整形 ...
- iOS自学之NSOperation、NSOperationQueue、Background
iOS中多线程编程主要分为NSThread.NSOperation和GCD,今天主要记录下自己在学习NSOperation中的点滴-如有不对的地方帮忙指出下,PS:人生第一次写blog,各位看官请轻虐 ...
- Objective-C 【多态】
------------------------------------------- 多态的概念.实现以及注意事项 程序中的多态:不同的对象 以自己的方式去 响应 相同方法名(父类同 ...
- jQuery 源码分析 7: sizzle
jQuery使用的是sizzle这个选择器引擎,这个引擎以其高速著称,其实现十分精妙但是也足够复杂,下面现简单分析一下相关的代码. 在jQuery的部分API接口是直接引用了Sizzle的方法,这些接 ...
- Java多线程间通信-解决安全问题、等待唤醒机制
/*1.增加一个知识点一个类怎么在所有的类中,让其它类来共同修改它的数据呢?可以用单例设计模式可以用静态可以在其它类中做一个构造函数,接受同一个对象,这样就可以实现对象 2.状态选择可以用数字0 1 ...
- centos6.3安装openvpn客户端
centos6.3安装openvpn客户端 Centos 默认是没有提供Openvpn的,而且在yum 的源里面也没有openvpn ,如果想使用yum安装的话要首先安装EPEL这个东西.www.2c ...
- TweenMax动画库学习(二)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- svn 相关
// svn相关内容,windows下的可以根据网上的,安装客户端和服务器端安装成功后,可以在服务器端中的 Repositories中建立相关的项目库文件夹,右键相应的文件夹可以复制相关的 url,一 ...