Object-C总结摘录

 1、  Object-C语言是由Brad J.Cox于20世纪80年代早期设计的,它是以SmallTalk-80语言为基础的。但是,Object-C是C语言的扩展,它是C的超集。

2、  在终端使用gcc编译一个Object-C源文件main.m,命令如下:

gcc –framework Fundation main.m –o man

3、  Object-C入口函数为main。

4、  4种基本数据类型:int float double char ,还有其它3种特殊的数据类型:_Bool、_Complex、_Imaginary,分别用于处理布尔值、复数及抽象数字。

使用布尔数据类型时,经常使用BOOL,这种“数据类型”其实并不是真正的数据类型,而只是char数据类型的别名,通过typedef实现的。

5、  单行注释用//,代码块注释用 /**/,但是/*注释不能嵌套使用。

6、  变量名称必须以字母或_开头。

7、  Object-C中大小写字母是由区别的。即:int idx,Idx 表示两个不同的变量。

8、  #import <Foundation/Foundation.h>表示引入系统头文件;

#import “Cat.h”,表示引入本地头文件。

9、  -(void)print,表示是一个实例方法;+(void)print,表示是一个类方法。

10、              使用关键字@interface声明一个类,比如Cat.h:

@interface Cat:NSObject //表示Cat类的父类是NSObject

@property int age;//1

@end //表示声明结束

从Object-C 2.0开始,上面代码1可自动生成设置age的函数及获取age的函数(即:setter、getter方法),其实现是语言层面的,是由Object-C 2.0的编译器负责生成的。

但是,Cat.m文件中要使用关键字@synthesize指令,

#import “Cat.h”

@implementation Cat // implementation,是实现方法的关键字

@synthesize age;

 

@end

11、              Cat *cat = [Cat new],其中的new方法是将alloc与init操作合并在一起了,应该尽量不用这种方式。

12、              多参数函数声明:-(void)setWidth:(int) width  height:(int) height;

第一个height为setWidth函数第二个参数的名称,第二个height为形参名称。

参数名称是可选的,为了程序的可读性更好,应该使用带参数名称的函数声明方式。

13、              类的每个实例都拥有实例变量,即使这些实例变量时继承来的。

14、              分类(Category)允许以模块方式向现类定义添加新方法(不可以添加实例变量);当要对没有源代码访问权限的类添加新定义时,可以使用分类技术。

当然也可以使用继承,怎么选择使用分类还是继承呢?

我的理解:继承会增加对象间的复杂度,一旦继承某个类,会继承该类的所有实例变量和实例方法,但是并不一定都需要,这时继承这一堆东西就是浪费。1)如果仅仅关注要扩展的该类缺失的功能,并不太关注该类其他的数据和功能,那么应该使用分类(Category),否则可选择使用继承;2)如果想为该类扩展数据,那只能选择继承了,因为分类无法扩展实例变量,而只能扩展方法。

15、              @class指令,比如:@class Cat; 这时编译器不再需要处理整个Cat.h头文件,会适当提高效率,但是如果当前类需要引用Cat类中的方法,仅用@class指令时不够的,因为编译器需要更多信息,比如:该方法中有多少参数,参数是什么类型,方法的返回类型等,而@class仅仅是提供了一个已知的类名称,此时只能用#import “Cat.h”。

16、              抽象类:创建该类的目的是为了使用其子类,而不是直接使用该类。

Foundation框架中的NSNumber就是为了将数字作为对象处理而创建的一个抽象类。

整数与浮点数通常有不同的内存需求,每种数字类型都有单独的NSNumber子类。向NSNumber类发送消息来创建新的整数对象时,使用合适的子类为整数对象分配必须的空间,并正确地设定其值。

但是,这些子类是私有的,无法直接访问这些子类,只能通过抽象的超类间接访问。

17、              多态:不同类的对象可以定义共享相同名称。如:id数据类型可以用来存储属于任何类的对象。

18、              动态类型:使程序直到执行时才确定对象所属的类。

19、              动态绑定:使程序直到执行时才确定要对对象调用的方法。

20、              如果一个类包含多个初始化方法,那么其中一个应该是指定的初始化方法,并且其它所有初始化方法都使用这个方法。

21、              分类:

1)  分类可以访问原始类的实例变量,但是不能添加自身的任何变量。

2)  虽然分类可以重写该类中的方法,但是通常不这么做。如果确实需要重写方法,应该选择继承而不是分类。

3)  不必实现分类中的所有方法。

4)  通过使用分类添加方法扩展类不仅会影响这个类,同时也会影响它的所有子类。

5)  对象/分类命名对必须是唯一的。

22、              协议:是多个类共享的一个方法列表(类比java中的接口)。

23、              C-string由char字符组成;NSString对象由unichar字符组成,unichar字符时符合Unicode标准的多字节字符。

24、              NSObject中有个description方法(类比java中的toString方法)。

25、              NSString:创建内容不可更改的对象;NSMutableString:创建内容可以更改的对象;

类似的还有:

NSArray与NSMutableArray,NSDictionary与NSMutableDictionary;NSSet与NSMutableSet(一组单值对象集合)

26、              字典的键必须是单值的,尽管通常是字符串,但可以使任何对象类型。和键关联的值可以任何对象类型,但不可以为nil。

27、              如果obj1与obj2是同一对象,说明它们占用相同的内存位置。

28、              NSFileManager功能:

1)  创建一个新文件

2)  将数据写入文件/从现有文件中读取数据

3)  重命名文件

4)  删除、复制文件

5)  读取文件的大小等其他属性

6)  测试文件是否存在及两个文件内容是否相同等

以上操作也可针对目录。

29、              NSFileHandle:可以打开文件并对其执行多次读写操作,

1)  打开一个文件,执行读、写或更新操作

2)  在文件中查找指定位置

3)  从文件中读取特定数目的字节,或将特定数目的字节写入文件中

4)  也可以用于各种设备或套接字

30、              NSData:一个临时存储区,作为缓冲区,将文件的内容读入缓冲区,或将缓冲区的内容写入到一个文件。

31、              NSFIleManager枚举目录,方法enumerratorAtPath自动递归枚举子目录;方法directoryContentsAtPath方法不递归枚举。

32、              读写文件设置的缓冲区buffer数组一般都是2的乘方,这是因为底层操作系统通常以块为单位执行I/O操作的,而块的大小一般为2的乘方个字节。

33、              引用计数:跟踪对象的引用次数。

1)  将对象添加到任何类型的集合都会使该对象的引用次数增加。

2)  把对象赋值给另一个变量时,引用次数不会自动增加,所以必须程序员自己增加对象的引用次数。

3)  只要对象的引用计数大于0,系统就不会释放对象占有的内容。

4)  内存中常量字符串的空间分配与其他对象不同,它们没有引用计数机制,因此永远不能释放这些对象

34、              自动释放池可以自动释放添加到该池中的对象所使用的内存。向对象发送一条autorelease消息时,就将该对象添加到这个池中。

35、              自动释放池会嵌套使用。

36、              将对象添加到自动释放池中并没有释放它或使它无效,这仅仅是为以后释放它做了个标记。当池被释放时,如果对象的引用值恰好变为0,则释放对象的资源(所以,如果池被释放时,对象的引用值大于0,那么就不会释放对象的资源)。

37、              内存管理规则:

1)  不再使用创建或保持的对象时,就释放它们。

2)  发送一条release消息,不一定会销毁对象;只有当一个对象的计数变为0时,才能销毁这个对象。

3)  每次释放池时,系统通过向池中的每一个对象发送一条release消息来实现这个功能。同时,系统会向池中每个引用计数为0的对象发送一条dealloc消息来销毁这个对象。

4)  如果你的方法中不再使用一个对象,但需要返回它,那么向其发送一条autorelease消息,将它标记为以后释放;消息autorelease并不会影响对象的引用计数。因此,它允许消息的发送者使用这个对象,然而仍然在以后自动释放池时,释放这些对象。

5)  无论对象是否添加到自动释放池中,应用程序终止时,都会释放程序中对象占用的所有内存。

6)  如果想要保证在自动释放池被释放时对象仍然存在,则应该显示地保持它。如果对象的引用计数大于收到的autorelease消息总数目,则在池释放时会保留下来。

7)  如果使用alloc或copy方法(allocWithZone、copyWithZone、mutableCopy方法)直接创建对象,则由你负责释放对象。每次retain对象时,应该release或者autorelease它。

8)  除了上一条提到的方法,不用费心去其他方法返回的对象。这些对象应该被它们的方法自动释放,这就是首先在程序中创建自动释放池的原因。stringWithString之类的方法自动向新创建的字符串对象发送一条autorelease消息,把它们添加到自动释放池中。如果事先没有创建池,则会收到一条出错消息,意思是在没有池的情况下尝试自动释放对象。

38、              深浅复制相对对象而言,浅复制仅复制对象的指针,副本与原对象指针都指向相同的内存。深复制,不仅复制对象的指针,而且将原对象指针对应的内存内容完全复制一份,复制后的副本与原对象占用不同的内存地址,但是内存内容完全相同。

39、              产生一个对象的可变副本与一个对象本身是否可变无关。所以,可以创建可变对象的不可变副本;也可以创建不可变对象的可变副本。

40、              在创建数组的副本时,数组中的每个元素的保持计数将通过复制操作自动增1。因此,如果创建数组的副本并随即释放原始数组,那么副本仍然包含有效的元素。

41、              如果编写一个类的copyWIthZone:方法,而该类的超类也实现了<NSCopying>协议,那么应该先调用超类的copy方法以复制继承来的实例变量,然后加入自己的代码以复制想要添加到该类的任何附加的实例变量。

42、              编写一个类的赋值方法和取值方法时,一定要考虑实例变量中存储的内容,要检索的内容以及是否要保护这些内容。

43、              归档:用某种格式保存一个对象或多个对象,以便以后还原这些对象的过程。

44、              可以使用归档实现对象的复制,因为在归档和解档过程中产生对象的新副本。

45、              框架是一组从逻辑上组合在一起的类和例程。

标题基于Python的汽车之家网站舆情分析系统研究AI更换标题第1章引言阐述汽车之家网站舆情分析的研究背景、意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义说明汽车之家网站舆情分析对汽车行业及消费者的重要性。1.2国内外研究现状概述国内外在汽车舆情分析领域的研究进展与成果。1.3论文方法及创新点介绍本文采用的研究方法及相较于前人的创新之处。第2章相关理论总结和评述舆情分析、Python编程及网络爬虫相关理论。2.1舆情分析理论阐述舆情分析的基本概念、流程及关键技术。2.2Python编程基础介绍Python语言特点及其在数据分析中的应用。2.3网络爬虫技术说明网络爬虫的原理及在舆情数据收集中的应用。第3章系统设计详细描述基于Python的汽车之家网站舆情分析系统的设计方案。3.1系统架构设计给出系统的整体架构,包括数据收集、处理、分析及展示模块。3.2数据收集模块设计介绍如何利用网络爬虫技术收集汽车之家网站的舆情数据。3.3数据处理与分析模块设计阐述数据处理流程及舆情分析算法的选择与实现。第4章系统实现与测试介绍系统的实现过程及测试方法,确保系统稳定可靠。4.1系统实现环境列出系统实现所需的软件、硬件环境及开发工具。4.2系统实现过程详细描述系统各模块的实现步骤及代码实现细节。4.3系统测试方法介绍系统测试的方法、测试用例及测试结果分析。第5章研究结果与分析呈现系统运行结果,分析舆情数据,提出见解。5.1舆情数据可视化展示通过图表等形式展示舆情数据的分布、趋势等特征。5.2舆情分析结果解读对舆情分析结果进行解读,提出对汽车行业的见解。5.3对比方法分析将本系统与其他舆情分析系统进行对比,分析优劣。第6章结论与展望总结研究成果,提出未来研究方向。6.1研究结论概括本文的主要研究成果及对汽车之家网站舆情分析的贡献。6.2展望指出系统存在的不足及未来改进方向,展望舆情
/// @file main.cpp /// @brief 解决编译错误并支持 BMP 图像读取 // 包含必要的头文件 #include <iostream> #include <opencv2/opencv.hpp> // OpenCV 头文件用于图像处理 #include <Eigen/Dense> // Eigen 头文件用于矩阵运算 #include <g2o/types/sba/types_six_dof_expmap.h> // G2O 头文件用于图优化 using namespace std; using namespace cv; using namespace Eigen; // 配置 Eigen 矩阵和向量 void configureEigen() { MatrixXd mat(3, 3); // 创建一个 3x3 的动态矩阵 mat << 1, 2, 3, 4, 5, 6, 7, 8, 9; // 初始化矩阵内容 cout << "Eigen Matrix Example:" << endl << mat << endl; // 输出矩阵 } // 加载 BMP 图像 bool loadBmpImage(const string& path, Mat& image) { image = imread(path, IMREAD_COLOR); // 尝试加载图像 if (image.empty()) { // 检查是否成功加载 cerr << "Failed to load image from: " << path << endl; return false; } return true; } // 调用 calibrateCameraRO 函数(假设其原型已定义) double calibrateCameraRO( const vector<vector<Point3f>>& objectPoints, const vector<vector<Point2f>>& imagePoints, Size imageSize, Mat& cameraMatrix, Mat& distCoeffs, vector<Mat>& rvecs, vector<Mat>& tvecs, double flag = CALIB_RO DownsamplingFactor = 1.0) { return calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, distCoeffs, rvecs, tvecs, flag)[^5]; } int main() { try { // 设置输入路径 string inputPath = "C:\\ceshitupian\\distance2m_G200_M0.8s_D_0.2s_Yes\\shenrs1_34323.bmp"; // 输入路径[^6] // 加载 BMP 图像 Mat image; if (!loadBmpImage(inputPath, image)) { return -1; // 如果加载失败则退出程序 } // 展示加载成功的图像 namedWindow("Loaded Image", WINDOW_AUTOSIZE); imshow("Loaded Image", image); waitKey(0); destroyAllWindows(); // 测试 Eigen 功能 configureEigen(); // 验证 Eigen 配置是否正常 // 示例:调用 calibrateCameraRO 进行相机标定 vector<vector<Point3f>> objectPoints; // 物体点集合 vector<vector<Point2f>> imagePoints; // 图像点集合 Size imageSize(image.cols, image.rows); // 图像尺寸 Mat cameraMatrix, distCoeffs; // 相机内参和畸变系数 vector<Mat> rvecs, tvecs; // 旋转和平移向量 // 构造测试数据 objectPoints.push_back(vector<Point3f>{Point3f(0, 0, 0), Point3f(1, 0, 0), Point3f(0, 1, 0)}); imagePoints.push_back(vector<Point2f>{Point2f(10, 10), Point2f(20, 10), Point2f(10, 20)}); // 执行相机标定 double reprojectionError = calibrateCameraRO(objectPoints, imagePoints, imageSize, cameraMatrix, distCoeffs, rvecs, tvecs); cout << "Reprojection Error: " << reprojectionError << endl; // 输出结果 cout << "Camera Matrix:" << endl << cameraMatrix << endl; cout << "Distortion Coefficients:" << endl << distCoeffs << endl; } catch (const exception& e) { cerr << "Exception occurred: " << e.what() << endl; return -1; } return 0; } 给出此代码#include <Eigen/Dense> // Eigen 头文件用于矩阵运算 #include <g2o/types/sba/types_six_dof_expmap.h> // G2O 头文件用于图优化 这两个头文件的代码
05-23
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值