weak、 _weak、 _block的格式

本文详细介绍了Objective-C中弱引用(weak)与自动nil化的特性,对比了weak与assign的区别,并阐述了如何利用weak避免循环引用。此外,还深入解析了Block的基本语法与用法,包括其定义、返回值及参数列表。

1、weak比assign多了一个功能,当对象消失后自动把指针变成nil。所以在arc下,代理属性的声明,使用weak修饰符比assign修饰要好,这样可以避免循环引用。

2、__weak 声明了一个可以自动 nil 化的弱引用。

3、Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中。

4、  Block的原型:
返回值 (^名称)(参数列表)
Block的定义
^ 返回值类型 (参数列表) { 表达式 }
其中返回值类型和参数列表都可以省略,最简单的Block就是:
^{ ; };
一般的定义就是:
返回值 (^名称)(参数列表) = ^(参数列表){代码段};
为了方便通常使用typedef定义:
typedef void (^blk) (void);


提供了基于BP(Back Propagation)神经网络结合PID(比例-积分-微分)控制策略的Simulink仿真模型。该模型旨在实现对杨艺所著论文《基于S函数的BP神经网络PID控制器及Simulink仿真》中的理论进行实践验证。在Matlab 2016b环境下开发,经过测试,确保能够正常运行,适合学习和研究神经网络在控制系统中的应用。 特点 集成BP神经网络:模型中集成了BP神经网络用于提升PID控制器的性能,使之能更好地适应复杂控制环境。 PID控制优化:利用神经网络的自学习能力,对传统的PID控制算法进行了智能调整,提高控制精度和稳定性。 S函数应用:展示了如何在Simulink中通过S函数嵌入MATLAB代码,实现BP神经网络的定制化逻辑。 兼容性说明:虽然开发于Matlab 2016b,但理论上兼容后续版本,可能会需要调整少量配置以适配不同版本的Matlab。 使用指南 环境要求:确保你的电脑上安装有Matlab 2016b或更高版本。 模型加载: 下载本仓库到本地。 在Matlab中打开.slx文件。 运行仿真: 调整模型参数前,请先熟悉各模块功能和输入输出设置。 运行整个模型,观察控制效果。 参数调整: 用户可以自由调节神经网络的层数、节点数以及PID控制器的参数,探索不同的控制性能。 学习和修改: 通过阅读模型中的注释和查阅相关文献,加深对BP神经网络与PID控制结合的理解。 如需修改S函数内的MATLAB代码,建议有一定的MATLAB编程基础。
### 关于 `weak_ptr` 悬空的原因及解决方案 #### 什么是 `weak_ptr` 的悬空? `weak_ptr` 是一种不拥有资源所有权的智能指针,它不会影响被管理对象的引用计数。因此,当最后一个 `shared_ptr` 被销毁时,即使还有 `weak_ptr` 存在,其所指向的对象也会被释放[^2]。此时,如果尝试通过 `weak_ptr` 访问该已释放的对象,则会发生悬空的情况。 具体来说,`weak_ptr` 的悬空是指其内部记录的目标对象已经被销毁,而 `weak_ptr` 并未感知到这一点。只有当我们调用 `lock()` 方法时,才会返回一个有效的 `shared_ptr` 或者一个空的 `shared_ptr` 表明目标已被销毁[^3]。 --- #### 导致 `weak_ptr` 悬空的根本原因 1. **生命周期差异** `weak_ptr` 不参与资源的所有权管理,这意味着它的存在与否并不会阻止关联对象的销毁。一旦所有的 `shared_ptr` 都被销毁,对象就会被释放,即便仍有 `weak_ptr` 指向这个对象[^2]。 2. **延迟检测机制** `weak_ptr` 自身无法直接访问对象的状态,而是依赖于与其共享的控制块(Control Block)。直到调用 `lock()` 方法时,才检查对象是否仍然有效并决定返回的结果[^3]。 --- #### 解决方案 为了安全地处理 `weak_ptr` 悬空问题,通常采用以下策略: 1. **使用 `lock()` 方法验证有效性** 在实际操作之前,先调用 `lock()` 方法来获取一个临时的 `shared_ptr`。如果返回的有效 `shared_ptr` 对象为空,则说明原对象已被销毁;否则可以继续执行后续逻辑[^3]。 ```cpp void processObject(std::weak_ptr<int> wp) { std::shared_ptr<int> sp = wp.lock(); if (sp) { // 安全地使用 *sp 进行操作 std::cout << "Value: " << *sp << std::endl; } else { std::cerr << "The object has been destroyed." << std::endl; } } ``` 2. **避免长期持有 `weak_ptr`** 如果程序设计允许,应尽量减少长时间保持对某个对象的 `weak_ptr` 引用。这样能够降低因其他地方误操作而导致意外销毁的风险[^4]。 3. **结合 `enable_shared_from_this` 类模板** 当类继承自 `std::enable_shared_from_this<T>` 后,可以通过成员函数 `shared_from_this()` 创建新的 `shared_ptr` 实例而不需额外分配内存副本。但如果当前实例并非由任何现有的 `shared_ptr` 管理,则会抛出异常 `std::bad_weak_ptr` 提醒开发者注意潜在风险[^4]。 --- ### 总结 `weak_ptr` 的悬空问题是由于其本身特性所致——即不对资源实施强占有关系。针对这一现象的最佳实践便是利用内置工具如 `lock()` 函数确认状态后再做进一步动作,并遵循良好的编码习惯以规避不必要的隐患。 ```cpp #include <memory> #include <iostream> class MyClass : public std::enable_shared_from_this<MyClass> {}; void testWeakPtr() { auto obj = std::make_shared<MyClass>(); std::weak_ptr<MyClass> wptr(obj); try { auto spt = wptr.lock(); // 使用 lock() 判断是否悬空 if (!spt) throw std::runtime_error("Pointer dangled."); // 正常情况下可获得 shared_ptr std::shared_ptr<MyClass> safeSPT = spt->shared_from_this(); } catch (...) { std::cerr << "Caught exception due to dangling pointer."; } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值