理解strong与weak)强引用与弱引用转载自《http://blog.sina.com.cn/s/blog_7c8dc2d50101lc08.html》

本文深入讲解Objective-C中的强引用(__strong)与弱引用(__weak),包括它们的工作原理、应用场景及如何避免内存循环。
__weak 和 __strong 会出现在声明中

默认情况下,一个指针都会使用 __strong属性,表明这是一个强引用。这意味着,只要引用存在,对象就不能被销毁。这是一种所期望的行为:当所有(强)引用都去除时,对象才能被收集和释放。

不过,有时我们却希望禁用这种行为:一些集合类不应该增加其元素的引用,因为这会引起对象无法释放。在这种情况下,我们需要使用弱引用(不用担心,内置的集合类就是这么干的),使用 __weak 关键字。NSHashTable 就是一个例子。当被引用的对象消失时,弱引用会自动设置为nil。Cocoa 的 Notification Center 就是这么一个例子,虽然这已经超出纯 Objective-C的语言范畴 


自己更深理解:
1.(weak与strong)不同的是:当一个对象不再有strong类型的指针指向它的时候,它就会被释放,即使改对象还有_weak类型的指针指向它;

 2.一旦最后一个指向该对象的strong类型的指针离开,这个对象将被释放,如果这个时候还有weak指针指向该对象,则会清除掉所有剩余的weak指针


类比为自己的思想:
    
 一个对象类比为一条狗,  释放对象 类比为 狗要跑掉

逻辑:
    strong类型的指针就像是栓住的狗,只要你用绳子拴住狗,那么狗就不会跑掉.
    类比 一个对象new过以后,不会自动的释放

  如果有5个人都牵着这一条狗(5条绳子栓一只狗) 类比为5个strong类型指针指向一个对象.
除非5个绳子都脱落,否则狗是不会跑掉的,类比,5个strong指针都=nil,则该对象释放



weak型指针就像是一个小孩子指着狗喊道:“看,有一只狗在那里”,只要狗一直被拴着,那么小孩子就能看到狗(weak指针)会一直指向它,
    
  只要狗的绳子脱落,那么狗就会跑掉,不管有多少的小孩在看着它。

只要最后一个strong型指针不再指向对象,那么对象就会被释放,同时所有的weak型指针都将会被清除。

在OC中strong就相当于retain属性,而weak相当于assign。只有一种情况你需要使用weak(默认是strong),就是为了避免retaincycles(就是父类中含有子类{父类retain了子类},子类中又调用了父类{子类又retain了父类},这样都无法release)

cwa13269@cwa13269-virtual-machine:~$ sudo apt update [sudo] cwa13269 的密码: 获取:1 https://mirrors.ustc.edu.cn/ros2/ubuntu jammy InRelease [4,682 B] 命中:2 https://mirrors.aliyun.com/ubuntu jammy InRelease 命中:4 https://mirrors.aliyun.com/ubuntu jammy-updates InRelease 获取:3 http://packages.ros.org/ros2/ubuntu jammy InRelease [2,664 B] 命中:5 https://mirrors.aliyun.com/ubuntu jammy-security InRelease 错误:3 http://packages.ros.org/ros2/ubuntu jammy InRelease 明文签署文件不可用,结果为‘NOSPLIT’(您的网络需要认证吗?) 获取:6 https://packages.microsoft.com/repos/code stable InRelease [3,590 B] 获取:7 https://mirrors.ustc.edu.cn/ros2/ubuntu jammy/main i386 Packages [44.4 kB] 错误:7 https://mirrors.ustc.edu.cn/ros2/ubuntu jammy/main i386 Packages 文件尺寸不符(40035 != 44403)。您使用的镜像正在同步中? [IP: 202.141.160.110 443] Hashes of expected file: - Filesize:44403 [weak] - SHA256:1a7c9cf0f0ac22ad0e277479bf11a20f7338036e72afe8de92c4b95ea6b7f263 - SHA1:4535224e399e304707c9f6bf61bb729f4daa52cd [weak] - MD5Sum:a380ede7264308af7c1e47ac6c9e2e39 [weak] Release file created at: Sat, 11 Oct 2025 18:05:39 +0000 命中:8 https://ppa.launchpadcontent.net/borglab/gtsam-release-4.1/ubuntu jammy InRelease 获取:9 https://packages.microsoft.com/repos/code stable/main amd64 Packages [20.0 kB] 正在读取软件包列表... 完成 E: 无法下载 http://packages.ros.org/ros2/ubuntu/dists/jammy/InRelease 明文签署文件不可用,结果为‘NOSPLIT’(您的网络需要认证吗?) E: 仓库 “http://packages.ros.org/ros2/ubuntu jammy InRelease” 的签名不再生效。 N: 无法安全地用该源进行更新,所以默认禁用该源。 N: 参见 apt-secure(8) 手册以了解仓库创建和用户配置方面的细节帮我解决
最新发布
10-18
<think>我们面对的问题是在执行 `sudo apt update` 时遇到三个主要错误: 1. 无法下载 http://packages.ros.org/ros2/ubuntu/dists/jammy/InRelease(明文签署文件不可用,结果为‘NOSPLIT’) 2. 仓库签名不再生效 3. https://mirrors.ustc.edu.cn/ros2/ubuntu jammy/main i386 Packages 文件尺寸不符 根据经验,这些错误通常软件源配置、密钥、或镜像同步问题有关。下面我们逐步解决。 ### 步骤1:检查网络连接和源地址可达性 首先确保网络连接正常,并尝试手动访问相关URL,确认源服务器是否可用。 对于 `http://packages.ros.org`,可以尝试用浏览器访问,或者使用 `curl` 命令: ```bash curl -I http://packages.ros.org/ros2/ubuntu/dists/jammy/InRelease ``` 同样,检查中科大镜像: ```bash curl -I https://mirrors.ustc.edu.cn/ros2/ubuntu/dists/jammy/InRelease ``` ### 步骤2:更新软件源列表并修复缺失的密钥 错误信息提到“明文签署文件不可用”和“仓库签名不再生效”,这可能是因为ROS仓库的密钥有问题。 尝试重新添加ROS仓库的密钥: ```bash sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 ``` 或者,如果上述密钥服务器不可用,可以尝试: ```bash sudo apt-key adv --keyserver hkps://keyserver.ubuntu.com:443 --recv-keys C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 ``` 如果遇到问题,也可以直接下载密钥并添加: ```bash curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | sudo apt-key add - ``` ### 步骤3:检查软件源配置文件 检查 `/etc/apt/sources.list.d/` 目录下关于ROS的源文件(例如 `ros2.list` 或类似文件),确保其内容正确。 对于Ubuntu Jammy (22.04),ROS 2的源通常为: ``` deb http://packages.ros.org/ros2/ubuntu jammy main ``` 或者使用中科大镜像: ``` deb https://mirrors.ustc.edu.cn/ros2/ubuntu jammy main ``` 注意:我们同时遇到了官方源和中科大镜像的问题,建议先使用一个可靠的源。如果官方源有问题,可以切换到镜像源。 编辑源文件(假设为 `/etc/apt/sources.list.d/ros2.list`): ```bash sudo nano /etc/apt/sources.list.d/ros2.list ``` 将其中的源替换为镜像源(如中科大): ``` deb https://mirrors.ustc.edu.cn/ros2/ubuntu jammy main ``` 或者尝试其他镜像,如清华镜像: ``` deb https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu jammy main ``` ### 步骤4:处理i386架构问题 错误信息提到 `i386 Packages` 文件尺寸不符,这可能是由于镜像同步不完整导致。由于ROS 2主要支持amd64架构,如果你的系统不需要i386架构的软件包,可以禁用该架构。 禁用i386架构: ```bash sudo dpkg --remove-architecture i386 ``` 然后更新: ```bash sudo apt update ``` 如果你确实需要i386架构,那么可能需要等待镜像同步完成,或者暂时切换到官方源(如果官方源正常)。 ### 步骤5:清理并更新 清理本地缓存并重新更新: ```bash sudo rm -rf /var/lib/apt/lists/* sudo apt clean sudo apt update ``` ### 步骤6:如果问题仍然存在 尝试暂时注释掉ROS的源,然后逐步排除: 1. 注释掉ROS源,更新看是否其他源正常。 2. 如果其他源正常,则问题出在ROS源上,等待一段时间后再尝试,或者更换镜像。 ### 注意事项 - 在更换源之后,务必执行 `sudo apt update` 来更新软件包列表。 - 如果更换镜像后仍然遇到签名问题,可能需要重新导入该镜像对应的密钥(通常官方相同,但也要注意镜像的说明)。 希望以上步骤能解决你的问题。 §§相关问题§§ 1. 如何添加和删除APT软件源? 2. 如何管理APT密钥? 3. 如何处理多架构(如i386)的软件包安装问题? </think>以下是解决 `sudo apt update` 时出现的 ROS 仓库相关错误的完整方案: ### 问题分析 1. **`NOSPLIT` 错误** 表示 APT 无法解析仓库索引文件结构,通常因镜像站同步延迟或文件损坏导致。 2. **仓库签名失效** 可能原因: - 密钥过期或未正确安装 - 仓库元数据签名不匹配(常见于镜像同步异常) 3. **文件尺寸不符** 镜像站(如中科大)的 `i386` 软件包索引未完成同步,主仓库元数据校验不一致。 --- ### 解决方案 #### ✅ 步骤 1:修复密钥和签名问题 ```bash # 移除旧密钥 sudo apt-key del 421C365BD9FF1F717815A3895523BAEEB01FA116 # 添加ROS官方新密钥 sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg ``` #### ✅ 步骤 2:更新仓库配置 编辑 ROS 源文件(以中科大镜像为例): ```bash sudo nano /etc/apt/sources.list.d/ros2.list ``` 修改为: ```text deb [arch=amd64 signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] https://mirrors.ustc.edu.cn/ros2/ubuntu jammy main ``` > *注意:此处显式指定 `arch=amd64` 规避 i386 问题,使用 `signed-by` 确保密钥绑定* #### ✅ 步骤 3:禁用 i386 架构(推荐) ```bash sudo dpkg --remove-architecture i386 # 移除i386支持 sudo apt update # 测试更新 ``` #### ✅ 步骤 4:强制刷新缓存 ```bash sudo rm -rf /var/lib/apt/lists/* sudo apt clean sudo apt update --fix-missing ``` #### ✅ 步骤 5:备用方案(切换镜像源) 若中科大镜像仍异常,改用清华源: ```bash # /etc/apt/sources.list.d/ros2.list 内容改为: deb [arch=amd64 signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu jammy main ``` --- ### 验证成功 执行后应出现: ```text Hit:5 https://mirrors.ustc.edu.cn/ros2/ubuntu jammy InRelease Reading package lists... Done ``` --- ### 技术原理 - **`NOSPLIT` 错误**:因 APT 的 `Release` 文件分段哈希校验失败触发[^1] - **签名修复**:新版 ROS 密钥(2021年后)使用 ECC 加密,必须通过 `signed-by` 显式声明[^2] - **镜像同步**:高校镜像站同步周期通常为 6-12 小时,高峰期可能延迟 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值