技术标签: 底层应用开发 objective-c Objective-C IOS ios 内存管理 指针
iOS OC中copy和mutableCopy的使用区别
// 浅复制
- (IBAction)shallowCopyAction:(id)sender {
NSArray *array0 = @[@"A", @"B", @"C"];
NSArray *array1 = array0;
NSArray *array2 = [array0 copy];
NSLog(@"array0 = %@ 指针地址 = %p", array0, array0);
NSLog(@"array1 = %@ 指针地址 = %p", array1, array1);
NSLog(@"array2 = %@ 指针地址 = %p", array2, array2);
array0 = @[@"OK", @"YES", @"NO"];
NSLog(@"array0 = %@ 指针地址 = %p", array0, array0);
NSLog(@"array1 = %@ 指针地址 = %p", array1, array1);
NSLog(@"array2 = %@ 指针地址 = %p", array2, array2);
}
打印输出:
2020-04-02 21:12:06.775103+0800 CopyDemo[1158:20138] array0 = (
A,
B,
C
) 指针地址 = 0x600002880de0
2020-04-02 21:12:06.775339+0800 CopyDemo[1158:20138] array1 = (
A,
B,
C
) 指针地址 = 0x600002880de0
2020-04-02 21:12:06.775487+0800 CopyDemo[1158:20138] array2 = (
A,
B,
C
) 指针地址 = 0x600002880de0
2020-04-02 21:12:06.775605+0800 CopyDemo[1158:20138] array0 = (
OK,
YES,
NO
) 指针地址 = 0x600002880e70
2020-04-02 21:12:06.775713+0800 CopyDemo[1158:20138] array1 = (
A,
B,
C
) 指针地址 = 0x600002880de0
2020-04-02 21:12:06.775823+0800 CopyDemo[1158:20138] array2 = (
A,
B,
C
) 指针地址 = 0x600002880de0
分析:
我们可以看到,在array0赋值成@[@“OK”, @“YES”, @“NO”]之前,array0、array1和array2都指向同一块内存空间,内容自然也相同。
(1) array1 = array0,所以array1和array0指向同一块内存空间
(2) copy操作如果来源对象是否可变,如果来源对象是不可变对象(NSArray),则只拷贝指针,也就是浅拷贝;
array0赋值成@[@“OK”, @“YES”, @“NO”]之后:
(1) array0指向了新的一块内存空间,也就是@[@“OK”, @“YES”, @“NO”]的内存空间;
(2) 而array1和array2仍指向之前的一块内存空间,也就是@[@“A”, @“B”, @“C”]的内存空间,所以内容还是@[@“A”, @“B”, @“C”]
// 深复制
- (IBAction)deepCopyAction:(id)sender {
NSArray *array0 = @[@"A", @"B", @"C"];
NSMutableArray *array1 = [array0 mutableCopy];
NSMutableArray *array2 = array1;
NSMutableArray *array3 = [array1 mutableCopy];
NSLog(@"array0 = %@ 指针地址 = %p", array0, array0);
NSLog(@"array1 = %@ 指针地址 = %p", array1, array1);
NSLog(@"array2 = %@ 指针地址 = %p", array2, array2);
NSLog(@"array3 = %@ 指针地址 = %p", array3, array3);
array0 = @[@"OK", @"YES", @"NO"];
[array1 addObject:@"D"];
NSLog(@"array0 = %@ 指针地址 = %p", array0, array0);
NSLog(@"array1 = %@ 指针地址 = %p", array1, array1);
NSLog(@"array2 = %@ 指针地址 = %p", array2, array2);
NSLog(@"array3 = %@ 指针地址 = %p", array3, array3);
}
打印输出:
2020-04-02 21:17:57.474876+0800 CopyDemo[1158:20138] array0 = (
A,
B,
C
) 指针地址 = 0x600002880e40
2020-04-02 21:17:57.475197+0800 CopyDemo[1158:20138] array1 = (
A,
B,
C
) 指针地址 = 0x600002880e10
2020-04-02 21:17:57.475409+0800 CopyDemo[1158:20138] array2 = (
A,
B,
C
) 指针地址 = 0x600002880e10
2020-04-02 21:17:57.475544+0800 CopyDemo[1158:20138] array3 = (
A,
B,
C
) 指针地址 = 0x600002880ae0
2020-04-02 21:17:57.475714+0800 CopyDemo[1158:20138] array0 = (
OK,
YES,
NO
) 指针地址 = 0x60000289cfc0
2020-04-02 21:17:57.475853+0800 CopyDemo[1158:20138] array1 = (
A,
B,
C,
D
) 指针地址 = 0x600002880e10
2020-04-02 21:17:57.475990+0800 CopyDemo[1158:20138] array2 = (
A,
B,
C,
D
) 指针地址 = 0x600002880e10
2020-04-02 21:17:57.476128+0800 CopyDemo[1158:20138] array3 = (
A,
B,
C
) 指针地址 = 0x600002880ae0
分析:
(1) array0 = @[@“A”, @“B”, @“C”]; array0指向@[@“A”, @“B”, @“C”]的内存空间,地址为0x600002880e40
(2) copy操作如果来源对象是可变对象(NSMutableArray),则拷贝对象内容,也就是深拷贝
array1 = [array0 mutableCopy]; array1重新开辟一块内存空间,拷贝array0的内容,新的地址是0x600002880e10
(3) array2 = array1; array2和array1指向同一块内存空间,内容相同,地址是0x600002880e10
(4) array3 = [array1 mutableCopy],array3重新开辟一块内存空间,拷贝array1的内容,新的地址是0x600002880ae0
在array0 = @[@“OK”, @“YES”, @“NO”];
[array1 addObject:@“D”];
这两行语句之前:
(1) array0 = @[@“A”, @“B”, @“C”]; array0指向@[@“OK”, @“YES”, @“NO”]的内存空间,地址变成新的地址0x60000289cfc0
(2) [array1 addObject:@“D”];array1增加一个新的元素@“D”,内容变成@[@“A”, @“B”, @“C”, @“D”]。地址不变,仍是0x600002880e10
(3) array2和array1指向同一块内存空间,内容、地址和array1一样
(3) array3的地址和array1不一样,不受影响。内容还是@[@“A”, @“B”, @“C”]
今天在使用mysql命令行进行分组时报错:ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'database_tl.emp.id' which is not functionally dependent on columns
import pandas as pd创建DataFrame df = pd.DataFrame([1,2,3,4], [5,6,7,8]) df.columns = ['a', 'b', 'c', 'd']读入excel df = pd.read_excel(data_path, sheetname=[0,1]) df = pd.read_excel(data_path, sheetname='sheet1') #如果报错的话可以尝试 df = pd.read_e_= data[data['name 1'] == 'reifen']
/*和标准用户有关的处理的API。*/---和用户处理有关的APIFND_USER_PKG---和用户密码处理有关的APIfnd_web_sec---和用户职责处理有关的APIFND_USER_RESP_GROUPS_API--------------------------------处理实例--------------
号外!号外!走过,路过,不要错过!日本 IT 业的狗血八卦继续独家放送啦!!2015 年 9 月 3 日,随着东京最高法院驳回瑞穗证券的上诉,维持二审的原判结果,一个长达 10 年的诉讼终于画下了句号。这个判例将对 IT 行业产生深远的影响:如果程序的 bug 导致了巨大的经济损失,应该由谁来承担?用户?运营商?还是系统开发商?Bug:计算机程序里的错误今天故事的主角是,瑞穗(みず..._系统bug 被起诉怎么判定
# jQuery中的post请求*******需要引入JQuery包**```用户名:密 码:$("#btn").click(function () {$.ajax({url:"/login_post",//路径type:"POST",//请求方式data:{//向服务器传送的数据//获取用户输入的信息username:$("#username").val(),password:$("#passw..._html jquery post
1.概述 QTreeView 最长用的一个功能就是作为导航栏,像vs里的项目结构树,word的文档结构图,资源管理器的文档结构,等等都是利用树形结构组织的,在前面已经讲述了 Qt中使用标准化项目模型QStandardItemModel对树形控件节点的操作。但有时候,光有节点显示还是不够的,..._qstandarditemmodel
QueryPerformanceCounter() 高精度定时器…………查询不正常,在多核的情况下可以用用SetThreadAffinityMask() 解决 WINAPISetThreadAffinityMask( __in HANDLE hThread, __in DWORD_PTR dwThreadAffinityMask );该函数
Android studio启动自带的模拟器,提示"Error While waiting for device: The emulator process for AVD has terminated"。
阶乘之和时间限制:3000 ms | 内存限制:65535 KB难度:3描述 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;输入第一行有一个整数0每组测试数据有一个正整数n输出如果符合条件,输出Yes,否则输出No;样例输入2910样例输出Yes
因为前两天在学校测试代码时,飞机在mission模式下突然出现在每一个mission点都会停留两三分钟的问题,而且偏航还一直在旋转,QGC上也会提示mag sensors inconsistent,于是考虑可能是mag(也就是磁力计)有问题了。于是先是校准了两次,可还是会出现同一个问题。然后查阅资料有人说pixhawk2.1内部有三个磁力计,两个在飞控中,一个在GPS中(也就是外部磁力计),...
Asp.net导出到Excel 支持的各种类型的格式:1) 文本:vnd.ms-excel.numberformat:@2) 日期:vnd.ms-excel.numberformat:yyyy/mm/dd3) 数字:vnd.ms-excel.numberformat:#,##0.004) 货币:vnd.ms-excel.numberformat:¥#,##0.005) 百分比:vnd.ms-excel.numberformat: #0.
问题调用了signal(SIGPIPE, SIG_IGN)仍然出现Program received signal SIGPIPE, Broken pipe.解答GDB调试网络程序时,会遇到SIGPIPE信息,默认GDB会把程序停下来,即使程序使用signal(SIGPIPE, SIG_IGN);来忽略信号。在gdb模式下运行下面的命令)handle SIGPIPE nostop print如果连信息提示都不想看见,可以这样设置:handle SIGPIPE nostop noprint.._signal name : sigpipe signal meaning : broken pipe