Effective-Objective-C-读书笔记-Item-1

本文介绍了Objective-C的基本概念,包括其独特的消息传递机制、与C语言的关系以及内存管理方式。通过对比Java和C++,突出了Objective-C在运行时确定方法调用的特性。

原文链接:http://tutuge.me/2015/02/05/Effective-Objective-C-%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0-Item-1/

前言

一直都在做项目,没什么时间作总结,感觉很不是滋味。现在放假了,嗯,终于有时间了~~哈哈(天生程序猿一枚好不好=。=)
最近开始读英文版的Effective Objective-C 2.0,觉得不错,就总结些东西,分享给各位读者吧。

Item 1 - Familiarize Yourself with Objective-C’s Roots

第一章的目的,就是让大家熟悉Objective-C,自然,标题的意思也就是“了解Objective-C的基本概念”,不多说,开写。

消息与运行时

总的来说,Objective-C跟C++、Java这些面向对象的语言是非常相似的,但是还是有许多不同的地方。如果你是第一次看到Objective-C的语法,一定觉得非常奇怪,因为Objective-C使用的是基于消息(Message)的框架,而不是传统的方法、函数调用。如下:

//Objective-C
Person *person = [Person new];
[person setName:@"tutuge" age:24];

//Java
Person person = new Person();
person.setNameAndAge("tutuge", 24);

//C++
Person *person = new Person;
person->setNameAndAge("tutuge", 24);

很奇怪是不是,各种中括号。但是我觉得,Objective—C这么设计就是为了时刻提醒你,“我是基于消息机制的!”。消息,的确是Objective-C与Java、C++这种语言最大的不同,而且,这种不同远不止在语法上面。简单来说如下两点:

  • 基于消息的调用: 所有的函数调用都是在“运行时”决定的。
  • 基于方法的调用: 所有的函数调用都是在“编译时”决定的,就是编译器编译时决定的。

其实,连被调方法的对象类型,都是在运行时决定的。所以说,Objective-C的运行时系统,担负了绝大部分的工作。这么设计的优点,举个例子,就是当运行时系统升级时,原有的代码不用重新编译即可“享受”升级带来的好处。

C的超集

Objective-C是C语言的超集,所以C语言所具有的一切特性,Objective-C都可以兼容,充分理解C语言的内存模型,对理解Objective-C很有帮助。如下:

NSString *str = @"a string";

这一行代码跟C语言没有什么不同,(忽略@符号=。=),原理跟C语言也是一致的,就是str指针是NSString类型的指针,指向了一块存着字符串“a string”的内存区域。不同的是,在Objective-C里,所有的对象只可以声明为指针类型,所以如下代码是不合理的:

NSString str;

为了更充分的理解,咱们看看如下例子:

NSString *str1 = @"a string";
NSString *str2 = str1;

熟悉C语言的朋友应该知道这是怎么回事,内存当中只有一块区域储存着“a string”这个字符串,str1、str2都是指向着这个区域的字符串指针。如下图:

imageimage

  • str1、str2都在栈内存上分配的,就是字符串(NSString)类型的指针。
  • “a string”字符串实际储存在堆内存上。
  • str1、str2均指向同一块内存区域。

此处的栈内存、堆内存跟C语言中的概念也是一样的,不同的是,在Objective-C中,我们不用手动去malloc、free内存,Objective-C使用内存计数计数帮我们管理内存。

结构体,基本类型

在Objective-C中,并不是所有的变量都是指针类型的,像int、float、double这些依旧是传统的“栈上分配”的,当然,还有结构体struct、枚举enum、联合union等。如:

CGPoint point = CGPointMake(10, 10);
CGRect frame = CGRectMake(0, 0, 10, 10);

这的CGPoint、CGRect都是结构体,但是都是直接在栈上分配内存的,以减少过度使用Objective-C类型的类(减少运行时的压力),各位读者使用的时候要注意。

总结

零散的说了一些Objective-C的特点,远远不足以讲明白Objective-C,我这只是根据Effective Objective-C这本书给个引子,还是推荐Apple的官方教程、文档,要想掌握扎实,还是要一步一步来~

基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的Koopman算子的递归神经网络模型线性化”展开,旨在研究纳米定位系统的预测控制问题,并提供完整的Matlab代码实现。文章结合数据驱动方法与Koopman算子理论,利用递归神经网络(RNN)对非线性系统进行建模与线性化处理,从而提升纳米级定位系统的精度与动态响应性能。该方法通过提取系统隐含动态特征,构建近似线性模型,便于后续模型预测控制(MPC)的设计与优化,适用于高精度自动化控制场景。文中还展示了相关实验验证与仿真结果,证明了该方法的有效性和先进性。; 适合人群:具备一定控制理论基础和Matlab编程能力,从事精密控制、智能制造、自动化或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能控制设计;②为非线性系统建模与线性化提供一种结合深度学习与现代控制理论的新思路;③帮助读者掌握Koopman算子、RNN建模与模型预测控制的综合应用。; 阅读建议:建议读者结合提供的Matlab代码逐段理解算法实现流程,重点关注数据预处理、RNN结构设计、Koopman观测矩阵构建及MPC控制器集成等关键环节,并可通过更换实际系统数据进行迁移验证,深化对方法泛化能力的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值