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 导读 空间新业务需求日益增多,在业务开发阶段的疏忽,或者是受到其他业务的影响(比如一些非空间的业务网络回包或者逻辑在主线程 ...
随机推荐
- 【转】为 XmlNode.SelectNodes 加上排序功能
测试资料: <Config> <Item a='/> <Item a='/> <Item a='/> <Item a='/> <Ite ...
- socket编程发送GET请求
可以根据几根url地址,分析出主机,地址,协议等,然后用封装成的类拼接成GET请求信息,用fsockopen连接主机,进行读取操作,获取响应信息,打印 <?php //http连接接口 inte ...
- 预算oracle
select * from ( )) CODE_VERSION from ( SELECT tb_cube_fc05.pk_entity pk_org,/*主体pk*/ org_orgs.code o ...
- RabbitMQ 原文译02--工作队列
工作队列: 在上一篇文章中我们我们创建程序发送和接受命名队列中的消息,在这篇文章我会创建一个工作队列,用来把耗时的操作分配给多个执行者. 工作队列(任务队列)的主要实现思想是避免马上执行资源密集型的任 ...
- asp生成静态HTML(动态读取)
这样的代码多用于我们没有实现设计生成静态的功能,但又想临时将一些动态页面生成静态的,直接获取动态内容并保存为静态的 复制代码代码如下: <!--#include file="admin ...
- 微信公众账号 Senparc.Weixin.MP SDK 开发教程
http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html 微信公众账号 Senparc.Weixin.MP SDK ...
- java String的equals,intern方法(转载)
JAVA中的equals和==的区别 ==比较的是2个对象的地址,而equals比较的是2个对象的内容. 显然,当equals为true时,==不一定为true: 基础知识的重要性,希望引起大家的重视 ...
- eclipse中启动Genymotion模拟器的错误
错误程序: Output file: C:\Users\wishwzp\.genymotion-eclipse.logLoading Genymotion libraryGenymotion dire ...
- seaJs 使用
开始使用seajs的时候折磨了我好一阵.光是各种概念就让新手难理解.现在弄清楚了,上个实践以备忘.目录结构如图. 1.文件 sea.html main.js a.js b.js c.js 最 ...
- LeetCode FindMinimuminRotatedSorteArray &&FindMinimuminRotatedSorteArray2
LeetCode上这两道题主要是使用二分搜索解决,是二分搜索算法的一个应用,根据条件每次舍弃一半,保留一半. 首先第一题: FindMinimuminRotatedSorteArray(时间复杂度为二 ...