Swift3中的Array内存地址和关联对象的问题
时间:2022-05-30
本文章向大家介绍Swift3中的Array内存地址和关联对象的问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
直接用OC的关联对象
空数组
//
// ViewController.swift
// SwiftRunner
//
// Created by Ferris on 2018/1/27.
// Copyright © 2018年 Ferris. All rights reserved.
//
import UIKit
var objc_associate_ket_array:UInt8 = 0
var objc_asssciate_key_object:UInt8 = 1
extension Array{
var fg_identify:String{
set{
objc_setAssociatedObject(self, &objc_associate_ket_array, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
get{
if let rs = objc_getAssociatedObject(self, &objc_associate_ket_array) as! String?{
return rs
}else{
return "没有关联对象"
}
}
}
}
extension NSObject{
var fg_tag:String{
set{
objc_setAssociatedObject(self, &objc_asssciate_key_object, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
get{
return objc_getAssociatedObject(self, &objc_asssciate_key_object) as! String
}
}
}
class ViewController: UIViewController {
let object_a = NSObject()
let object_b = NSObject()
let object_c = NSObject()
var array_a:[NSObject] = []
var array_b:[NSObject] = []
var array_c:[NSObject] = []
override func viewDidLoad() {
super.viewDidLoad()
object_a.fg_tag = "a"
object_b.fg_tag = "b"
object_c.fg_tag = "c"
array_a.fg_identify = "a"
array_b.fg_identify = "b"
array_c.fg_identify = "c"
// Do any additional setup after loading the view, typically from a nib.
}
override func viewDidAppear(_ animated: Bool){
super.viewDidAppear(animated)
print("object_a = (object_a.fg_tag)")
print("object_b = (object_b.fg_tag)")
print("object_c = (object_c.fg_tag)")
print("array_a = (array_a.fg_identify)")
print("array_b = (array_b.fg_identify)")
print("array_c = (array_c.fg_identify)")
}
}
输出结果如下
object_a = a
object_b = b
object_c = c
array_a = c
array_b = c
array_c = c
也就是说三个数组全都指向同一个关联对象,为了证实三个数组的内存地址是否一致,直接打印地址 修改get函数
get{
print("(UnsafeRawPointer(self))")
if let rs = objc_getAssociatedObject(self, &objc_associate_ket_array) as! String?{
return rs
}else{
return "没有关联对象"
}
}
得到输出
0x02504cb0
array_a = c
0x02504cb0
array_b = c
0x02504cb0
array_c = c
居然真的一样!!
非空数组
内含OC对象
给数组加上object_a
对象
array_a.append(object_a)
array_b.append(object_b)
array_c.append(object_c)
得到的结果
object_a = a
object_b = b
object_c = c
0x7af37274
array_a = a
0x7c241854
array_b = b
0x7c241884
array_c = c
完全正常,和预想的一致
内含Swift对象
将数组改成
var array_a:[Any] = []
var array_b:[Any] = []
var array_c:[Any] = []
其余代码不变 输出结果变为
0x7a968424
array_a = 没有关联对象
0x7a874964
array_b = 没有关联对象
0x7a874994
array_c = 没有关联对象
关联对象失效了! 将Any换为String等Swift对象类型,依旧一样
查看内存地址
var fg_address:String{
get{
return "(UnsafeRawPointer(self))"
}
}
修改代码如下
let object_a = NSObject()
let object_b = NSObject()
let object_c = NSObject()
var array_a:[Any] = []
var array_b:[Any] = []
var array_c:[Any] = []
var mix_array:[[Any]] = []
override func viewDidLoad() {
super.viewDidLoad()
object_a.fg_tag = "a"
object_b.fg_tag = "b"
object_c.fg_tag = "c"
array_a.append(object_a)
array_b.append(object_b)
array_c.append(object_c)
array_a.fg_identify = "a"
array_b.fg_identify = "b"
array_c.fg_identify = "c"
mix_array.append(array_a)
mix_array.append(array_b)
mix_array.append(array_c)
mix_array.fg_identify = "mix"
// Do any additional setup after loading the view, typically from a nib.
}
override func viewDidAppear(_ animated: Bool){
super.viewDidAppear(animated)
print("object_a = (object_a.fg_tag)")
print("object_b = (object_b.fg_tag)")
print("object_c = (object_c.fg_tag)")
print("array_a = (array_a.fg_identify) + (array_a.fg_address)")
print("array_b = (array_b.fg_identify) + (array_b.fg_address)")
print("array_c = (array_c.fg_identify) + (array_c.fg_address)")
print("mix_array0 = (mix_array[0].fg_identify) + (mix_array[0].fg_address)")
print("mix_array1 = (mix_array[1].fg_identify) + (mix_array[1].fg_address)")
print("mix_array2 = (mix_array[2].fg_identify) + (mix_array[2].fg_address)")
}
输出
array_a = 没有关联对象 + 0x7bf86cc4
array_b = 没有关联对象 + 0x7bf86a64
array_c = 没有关联对象 + 0x7bf86a94
mix_array0 = 没有关联对象 + 0x7bf86cc4
mix_array1 = 没有关联对象 + 0x7bf86a64
mix_array2 = 没有关联对象 + 0x7bf86a94
当数组被放进另一个数组时,会发现内存地址是一样的。
如果把array_a
的类型改成[NSObject]
呢,神奇的事情出现了
var array_a:[NSObject] = []
输出
array_a = a + 0x0000610000053e80
array_b = 没有关联对象 + 0x0000610000260da0
array_c = 没有关联对象 + 0x0000610000260de0
mix_array0 = 没有关联对象 + 0x00006080002664a0
mix_array1 = 没有关联对象 + 0x0000610000260da0
mix_array2 = 没有关联对象 + 0x0000610000260de0
当a被放进另外一个数组的时候,内存地址变了!并且a本身也能拿到关联对象
var array_a:[NSObject] = []
var array_b:[NSObject] = []
var array_c:[NSObject] = []
输出
object_a = a
object_b = b
object_c = c
array_a = a + 0x00006180000496e0
array_b = b + 0x0000618000049260
array_c = c + 0x0000618000048540
mix_array0 = 没有关联对象 + 0x000061800026c320
mix_array1 = 没有关联对象 + 0x000061800026c460
mix_array2 = 没有关联对象 + 0x000061800026c4a0
输出!
object_a = a
object_b = b
object_c = c
array_a = a + 0x000061000005a8d0
array_b = b + 0x000061000005ae10
array_c = c + 0x000061000005ae40
mix_array0 = a + 0x000061000005a8d0
mix_array1 = b + 0x000061000005ae10
mix_array2 = c + 0x000061000005ae40
如果给空数组设置关联对象呢?
测试代码:改变一下位置
array_a.fg_identify = "a"
array_b.fg_identify = "b"
array_c.fg_identify = "c"
array_a.append(object_a)
array_b.append(object_b)
array_c.append(object_c)
输出
object_a = a
object_b = b
object_c = c
array_a = 没有关联对象 + 0x0000618000244610
array_b = 没有关联对象 + 0x00006180002441f0
array_c = 没有关联对象 + 0x00006180002444f0
mix_array0 = 没有关联对象 + 0x0000618000244610
mix_array1 = 没有关联对象 + 0x00006180002441f0
mix_array2 = 没有关联对象 + 0x00006180002444f0
- .NET Core RC2/RTM 明确了时间表
- kvm虚拟化关闭虚拟网卡virbr0的方法
- NET开发学习项目资源(2)
- Linux下selinux简单梳理
- 一段oracle中的“复杂”分组统计sql
- 通过Chocolatey软件包管理器安装.NET Core
- rsync同步时,删除目标目录比源目录多余文件的方法(--delete)
- 近期一枚“大文娱”dawenyu.com域名以小六位价格易主
- 分布式监控系统Zabbix-3.0.3-完整安装记录(0)
- URL安全的Base64编码
- 温故而知新:设计模式之原型模式(Prototype)
- Windows 7上执行Cake 报错原因是Powershell 版本问题
- 温故而知新:类索引器
- Visual Studio Code 代理设置
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CPU:别再拿我当搬砖工!
- 7类 登录/注册 安全漏洞
- 安全弹出你的移动设备,保护数据安全!
- burpsuite系列
- idea_Maven_setting文件依赖源国内镜像
- Wapiti安装及使用
- 利用burpsuite+sqlmap POST自动化注入详解
- GSoC: GitHub Checks API 项目第一阶段总结
- GoldenEye靶机渗透
- RBash - 受限的Bash绕过
- 【Rust日报】2020-08-10:在 Rust 中存储连续数据
- 用 Docker 打包 Node.js 程序
- 再见! JSP !
- SocketFTP多线程处理
- 面经手册 · 第4篇《HashMap数据插入、查找、删除、遍历,源码分析》