`
dcj3sjt126com
  • 浏览: 1905685 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

objective-c学习笔记第一天

    博客分类:
  • IOS
阅读更多

主机内容

类的申明

函数/消息的定义方法

字段作用域

 

 

语法纵览

关键字都有@开始,比如:

@class, @interface, @implementation,@public @private, @protected, @try, @catch, @throw, @finally, @end, @protocol, @selector, @synchronized, @encode, @defs

 

基本面向过程

比较项目 OC和C语言对比

基本类型 char, short, int, long long, BOOL

布尔 TRUE, FALSE    YES,NO

基本语句 if else switch for while do goto

for额外扩展 for ( xx in xx ) OC特有

 

面向对象概述

比较项目 OC

基类 NSObject

单继承 是单继承

接口 支持接口(协议) @protocol,接口方法可选实现

多继承 使用接口来实现多继承

多态 支持多态

抽象类 支持抽象类

异常处理 简单的异常处理

虚函数 所有的函数都是虚函数

 

和C/C++一些比较

OC和C/C++一样,都是用如下:

/* ... */ 和 //作为注释

 

BOOL,YES,NO

在C++中,布尔类型是bool, 在OC中,布尔类型是BOOL,布尔值有YES和NO两种

 

ID类型

OC中,每个目标都可以表达为ID类型,范性,可以认为是 NSObject * 或者void *

 

nil

nil等同于 null, 表示一个目标的指针

 

类的定义

OC类分为2个文件,一个是.h,一个是.m文件

.h文件存放类,函数申明

.m文件存放类的具体实现 

 

类申明使用关键字@interface  @end来申明

类实现使用关键字@implementation  @end来实现 

 

类声明   <Dog.h>

#import <Foundation/Foundation.h>

@interface Dog : NSObject {

//此处写字段

}

//此处写函数

 

@end

 

导入  To import or include ?

#import head.h

C/C++使用 #include 来包含头文件。缺点就是可能同一个头文件可能被包含多次

Object-C使用了#import来包含头文件。优点就是同一个头文件只能包含一次。

 #ifndef  __HEAD_H__

 #define  __HEAD_H__

 

 #endif

 

创建/销毁OC对象

创建对象

Dog * dog = [Dog alloc];

 

初始化构造函数

[dog init];

 

销毁对象

[dog release];

 

类中字段和函数

@interface Dog : NSObject {

int age; //字段定义在此

}

 

- (void)  setAge:(int) newAge; //函数定义在此

@end

 

字段定义

C++和OC在变量申明一样,都有public protected private 三种作用域

(C++) public: protected: private:

(OC)  @public @protected @private

OC缺少是@protected

C++和OC在函数声明不一样

OC函数全部都是public类型(用另外方式实现 private化)

变量必须类 {}之间的地方

 

变量作用域申明

文件Dog.h

@interface Dog : NSObject {

@public //可以是@public  @protected @private

int age;

@protected 

int ID;

@private 

float price;

}

@end

 

类申明比较

所有OC类,接口声明必须要带 *

这里*既表示指针也表示引用

 

OC:

Dog * myDog;

 

这里 * 即表示指针(又不表示指针), 也表示引用

可以通过myDog->dog 或者 myDog.dog这些方法来访问

 

一个典型类的实现 

类声明<Dog.h>

#import <Foundation/Foundation.h>

@interface Dog : NSObject {

int ae;

}

 

//下面这些在OC中是消息,但是为了方便理解就叫函数

-(id) init;

-(id) initWithAe:(int)newAge;

-(int) getAge;

-(void) setAge:(int)newAge;

@end

 

Dog.m

#import "Dog.h"

@impolementation Dog

 

-(id)int {

return [self initWithAge:10];

}

 

-(id) initWithAge:(int)newAge{

self = [super init];

if (self) {

age = newAge;

}

return self;

}

 

-(int) getAge {

return age;

}

-(void) setAge:(int) newAge {

age = newAge;

}

 

@end

 

函数定义

在OC中属性是申明只能在@interface{和}之间。

属性的使用和C语言类似

在@interface{和}之间不能定义方法。

方法的定义是:

- (int) f : (int)x;

这里-表示对象的方法,+表示类的方法和C++类似

返回值或者参数的类型申明是使用()包含

参数分割使用:来分开

 

函数定义例子

典型的函数和变量定义

文件Foo.h

@interface Foo : NSObject {

double x;

}

-(int) f:(int) x;

-(float) g :(int)x :(int)y;

@end

 

文件Foo.m

#ipmort "Foo.h"

@implementation Foo

-(int) f:(int) x {...}

-(float) g:(int)x :(int)y {...}

@end

 

多参数情况 

-(int) f:(int)x; 类似于C中的int f(int x);

函数不带参数(函数名:f)

- (int) f

类似C int f()函数

 

带一个参数(函数名: f:x)

- (int) f:(int)x

类似C的 int f(int x)函数

 

带两个参数(函数名:f::)

- (float) f:(int)x :(int)y

类似C的float f(int x,int y);

 

多参数方法

带两个参数(函数名:f::)

- (float) f:(int)x :(int) y

参数能够在:前面设置一个标签label,标签label也是函数名的一部分,标签是为了方便阅读(不带标签实际上也有一个匿名标签)

 

比如上述函数可以改成

- (float) f:(int)x g:(int)y

这里 g表示标签,函数名是f:g:

第一个参数不能有标签,事实上函数名就是第一个参数的标签

 

函数调用对别

比较项目 C OC

无参数 int foo(); - (int) foo;

如何调用的 int ret = obj->foo(); int ret = [obj foo];

 

一个参数 int foo(int a); - (int) foo:(int)a;

如何调用的 int ret = obj->foo(100); int ret = [obj foo:100];

 

二个参数 int foo(int a,int b); -(int)foo:(int)a :(int)b;

如何调用的 int ret = obj->foo(10,20); int ret = [obj foo:10 :20];

 

带标签 int fooAndB(int a, int b); -(int) foo:(int)a andB:(int)b;

如何调用的 int ret = obj->fooAndB(10,2); int ret = [obj foo:10 andB:2];

 

三个参数例子

C例子

int insertObjectAtIndexBefore (Object o, int index, boolean before);

int ret = obj->insertObjectAtIndexBefore(str, 2, true);

 

OC例子

-(int) insertObject:(NSObject *)o AtIndex:(int)index Before:(BOOL)before

int ret = [obj insertObject:10 AtIndex:2 Before:TRUE];

 

多参数的方法调用

-(void) insertObject:(int) value :(unsigned int)index

 返回值 函数名 第一个参数 第二个参数

 第二个参数不带标签label,也就是匿名标签,函数名

 insertObject::

 调用方法:[obj insertObject:100 :20]

[obj insertObject:101 :21]

 

-(void) insertObject:(int)value atIndex:(unsigned int)index

返回值 函数名 第一个参数 标签 第二个参数

第二个参数的标签是atindex。函数名为insertObject:atIndex:

调用方法:[obj insertObject:100 atIndex:20];

[obj insertObject:101 atIndex:21];

 

 

函数重载

@interface Foo : NSObject {}

-(int) g:(int) x;

-(int) g:(float) x; //错误:这个方法和前一个方法冲突(因为没有标签)

-(int) g:(int) x:(int) y; //正确:两个匿名的标签

-(int) g:(int) x:(float) y; //错误:也是两个匿名的标签

-(int) g:(int) x andY:(int) y; //正确:第二个标签是andY

-(int) g:(int) x andY:(float) y; //错误:第二个标签也是andY

-(int) g:(int) x andAlsoY:(int) y; //正确:第二个标签是andAlsoY

@end

 

 

各类函数名

@interface Foo : NSObject{}

//函数名是"g"

-(int)g;

//函数名是"g:"

-(int)g:(float)x;

//函数名是"g::"

-(int)g:(float)x :(float)y;

//函数名是"g:andY:"

-(int)g(float)x andY:(float) y;

//函数名是"g:andZ"

-(int)g:(float) x andZ:(float) z;

@end

 

 

Message消息机制

使用发送目标对象一个消息来达到处理函数

使用如下的格式来出来发送消息

[object message]

object.message

因为是动态绑定,消息和接受者都是在运动时动态绑定在一起。

object表示一个对象或者一个类,

message消息也可以认为是一个函数。

 

函数作用域申明

OC在.h头文件定义的所有函数都是public类型

OC通过Categories来实现函数的私有化

 

文件Dog.h

#import <Foundata/Foundation.h>

 

@interface Dog : NSObject

{//写字段

@protected 

int ID;

@public 

int age;

@private float price;

}

// 凡是以initXXXX开头的都是构造函数

- (id) init;

//函数名为init 不带参数

- (id) initWithID:(int)new ID;

//函数名为initWithID:带一个init的参数

- (id) initWithID:(int)newID andAge:(int) newAge;

//函数名为initWithID:andAge: 带2个参数,都为int

- (id) initWithID: (int)newID andAge:(int) newAge andPrice:(float) newPrice;

//函数名为initWithID:andAge:andPrice

//带有3个参数,都是为int

 

- (void) setID:(int)newId;

- (int) getID;

// set/get ID

 

- (void) setAge: (int)newAge;

- (int) getAge;

 

- (void) setPrice:(float) newPrice;

- (float) getPrice;

 

- (void) setID:(int)newID andAge:(int)newAge;

// setIDandAge: 2个参数

 

- (void) setID:(int)newID andAge:(int)newAge andPrice:(float)newPrice;

// setID:andAge:andPrice: 3个参数

 

@end

 

 

 

文件Dog.m

#import "Dog.h"

@implementation Dog 

 

- (id) init{

self = [super init];

// super表示父类

// self 表示对象自己

if (self) {

ID = 1;

age = 2;

price = 60.0f;

}

return self;

}

 

- (id) initWithID:(int)newID {

self = [super init]; //初始化父类的构造方法

if(self) {

ID = newID;

age = 2;

price = 60.0f;

}

return self;

}

 

- (id) initWithID:(int)newID andAge:(int) newAge{

return [self initWithID:newId andAge:newAge andPrice:60.0f];

}

- (id) initWithID: (int)newID andAge:(int) newAge andPrice:(float) newPrice{

self = [super init];

if(self) {

ID = newID;

age = newAge;

price = newPrice;

}

return self;

}

 

- (void) setID: (int) newID {

id = newID;

}

- (int) getID {

return ID;

}

 

-(void)setAge:(int)newAge {

age = newAge;

}

-(int)getAge{

return age;

}

-(void) setPrice:(float) newPrice {

price = newPrice;

}

-(float)getPrice {

return price;

}

 

-(void)setID:(int)newID andAge:(int)newAge {

ID = newID;

age = newAge;

price = newPrice;

}

 

@end

 

文件main.m

 

@autoreleasepool

Dog *dog1 = [Dog alloc];

[dog1 init]; 

 

init ID = [dog1 getID];

int age = [dog1 getAge ]; 

float price = [dog2 getPrice];

 

printf("dog1 id is%d age is %d price is %$", ID,age,price );

 

// dog1 id is 1 age is 2 price is 60.000000

// Dog *dog2 = [Dog alloc];

// [dog2 initWithID:100 andAge:26 andPrice:68.88];

 

Dog *dog2 = [[Dog alloc] initWithID:100 andAge:36 andPrice:68.88];

 

ID = [dog2 getID];

age = [dog2 getAge];

price = [dog2 getPrice];

 

printf("dog2 id is%d age is %d price is %f\n", ID,age,price );

//dog2 id is 100 age is 36 price is 68.879997

 

[dog2 setID:2012 andAge:38 andPrice:87.2];

printf("dog2 new id is%d age is %d price is %f\n", ID,age,price );

 

分享到:
评论

相关推荐

    iOS开发:从入门到精通的指南.docx

    - **Objective-C**:作为一种面向对象的语言,Objective-C是C语言的扩展,它引入了类、消息传递等概念。虽然Swift逐渐成为主流,但Objective-C仍然是许多现有项目的首选语言。 - **Swift**:Swift是由Apple开发的一...

    Java设计定制】考勤流程优化 - 论文、源码、PPT全套.zip

    高质量大全套,这是我用过的,改改名字直接那去用就好了

    TypeError Contract inherits from multiple base contracts with conflicting functions - 继承冲突(解决办法).md

    TypeError Contract inherits from multiple base contracts with conflicting functions - 继承冲突(解决办法).md

    mysql-connector-java-5.1.42.jar

    该资源为mysql-connector-java-5.1.42.jar,欢迎下载使用哦!

    内置式永磁电机(IPM)电磁与机械耦合分析及磁桥设计优化

    内容概要:本文深入探讨了内置式永磁电机(IPM)中磁桥设计面临的挑战及其解决方案。磁桥作为连接磁体和转子铁芯的关键部分,其厚度直接影响电机的电磁特性和机械强度。文中详细介绍了利用COMSOL软件进行电磁和机械耦合分析的方法,包括设置非线性材料属性、计算离心力以及处理磁体与铁芯间的接触问题。同时,讨论了磁致伸缩效应对系统的影响,并提出了通过参数化扫描优化磁桥厚度的技术路径。最终得出结论,最佳磁桥厚度应在0.5-1.2mm范围内,具体取决于冷却方式和材料选择。 适合人群:从事电机设计、电磁兼容性研究及相关领域的工程师和技术人员。 使用场景及目标:适用于希望深入了解IPM电机内部工作机制的研究人员,尤其是关注如何平衡电磁性能与机械强度的设计者。目标是在确保高效运行的同时提高设备的安全性和可靠性。 其他说明:文章强调了理论模型与实际应用相结合的重要性,指出即使是最优设计方案也需要考虑制造公差和长期使用的耐久性。此外,还提到了一些实用技巧,如采用不同导磁率材料来改善局部应力分布。

    Postgres Checkpointer 实战:优化数据持久化性能的策略

    Postgres Checkpointer 实战:优化数据持久化性能的策略 https://blog.csdn.net/weixin_47560078/article/details/148338420

    ### 2024年印尼税收袖珍指南-普华永道版

    内容概要:《2024年印尼税收袖珍指南》由普华永道发布,涵盖了印尼税收体系的关键方面。主要内容包括企业所得税、个人所得税、预提税、国际税收协定、增值税、奢侈品销售税、碳税、关税与消费税、税收优惠、地方税、印花税、税务会计、税务稽查与评估、强制执行征税、税务纠纷与处理等。企业所得税税率一般为22%,特定条件可享受优惠。个人所得税采用超额累进税率,最高达35%。预提税涵盖多种收入类型,如工资、利息、股息等。国际税收协定帮助避免双重征税,提供优惠税率。增值税标准税率为11%,部分商品和服务免征。税收优惠包括免税期、加计扣除等,尤其针对特定行业和地区。地方税种类繁多,如土地与建筑物税、机动车税等。税务稽查与评估确保纳税人合规,税务纠纷可通过异议、申诉、诉讼等方式解决。 适用人群:企业财务人员、税务顾问、跨国公司税务部门、个人纳税人等。 使用场景及目标:①帮助企业理解和遵守印尼税法,优化税务规划;②协助个人纳税人正确申报各类税项;③为税务顾问提供最新税收政策信息,提升专业服务水平;④为跨国公司处理跨境税务问题提供指导。 阅读建议:此指南内容详尽,建议读者根据自身需求重点阅读相关章节,结合实际案例深入理解各项规定,并关注最新政策动态,确保税务处理合法合规。

    使用Vditor将Markdown文档渲染成网页(Vite+JS+Vditor)

    详细介绍了通过Vditor将Markdown格式文档渲染成Web网页的具体实现,并且实现了Markdown格式不具备的图片格式居中以及图片源更换的功能。

    多智能体系统分布式自适应一致性控制技术及其Matlab实现

    内容概要:本文详细介绍了多智能体系统中分布式自适应一致性控制技术,涵盖线性和非线性动力学系统。文中探讨了纯一致性控制和leader-follower一致性控制两种主要研究方向,提出了一种基于自适应调节相邻智能体间耦合权值的分布式相对状态一致性协议。该协议能够在所有无向连通通信图上实现一致性,并且可以在没有全局信息的情况下完全分布式地执行。文章还提供了相应的Matlab复现代码,帮助读者理解和验证所提协议的有效性。 适合人群:从事自动化控制、人工智能领域的研究人员和技术人员,尤其是对多智能体系统感兴趣的专业人士。 使用场景及目标:①深入理解多智能体系统中分布式一致性控制的基本原理和实现方法;②掌握纯一致性控制和leader-follower一致性控制的设计思路;③通过Matlab代码实现实验验证,提升实际应用能力。 其他说明:本文不仅提供了理论分析,还包括详细的代码实现,有助于读者从理论到实践全面掌握该技术。未来研究将继续探索更复杂的动力学行为和通信图结构下的分布式一致性控制问题,并拓展其在无人驾驶、机器人编队等领域的应用。

    Test failed Assertion error(解决方案).md

    Test failed Assertion error(解决方案).md

    实训商业源码-智能设备-毕业设计.zip

    实训商业源码-智能设备-毕业设计.zip

    基于SVPWM原理的T型逆变器仿真研究:深入理解与实际应用指南

    内容概要:本文档详细介绍了基于空间矢量脉宽调制(SVPWM)原理的T型三相逆变器仿真实现方法。主要内容涵盖扇区判断、作用时间计算及时区切换等关键步骤,并提供了完整的仿真文件、详细说明文档及相关参考文献。文中不仅展示了具体的MATLAB和C++代码片段,还分享了作者在实际调试过程中遇到的问题及解决方案,如电压矢量落于扇区分界线时的边界容错处理、过调制情况下的饱和函数应用以及中点电位平衡问题等。最终仿真结果显示,在母线电压600V条件下,输出线电压THD低于3%,显著优于传统SPWM方法。 适合人群:电气工程专业学生、电力电子工程师及对SVPWM技术感兴趣的科研人员。 使用场景及目标:① 学习并掌握SVPWM的基本原理及其在T型逆变器中的具体应用;② 掌握从理论到实践的完整流程,包括仿真建模、代码实现及调试技巧;③ 提升解决实际工程问题的能力,如处理非线性因素带来的挑战。 其他说明:本文档强调理论与实践相结合,提供丰富的实战经验和实用技巧,帮助读者更好地理解和应用SVPWM技术。

    2006-2025 国内宏观经济数据集(21项)CSV

    该数据集记录了国内生产总值(GDP)的相关数据,数据覆盖时间从2006年1月起至今,数据按月度进行统计。 包含:居民消费价格指数CP1、国内生产总值 GDP、制造业采购经理指数 PMI、消费者信心指数、业品出厂价格指数 PP1、海关进出口增减情况 HGJCK、财政收入 czsr、社会消费品零售总额、全社会用电分类情况表、社会融资规模增量统计、LPR品种数据、年度外汇储备数据、M2货币供应年率、外汇贷款数据、大宗商品价格、本外币存款、存款准备金率、央行货币当局资产负债、货币供应量、央行黄金和外汇储备、中国GDP年率。

    MATLAB环境下8-PSK调制解调及多普勒频移同步算法仿真研究 数字通信 高级版

    内容概要:本文详细介绍了基于MATLAB的8-PSK(八相移键控)调制解调及其在存在多普勒频移情况下的同步算法仿真实现。首先解释了8-PSK的基本概念,包括其星座图特点以及在移动环境中由于多普勒效应引起的频偏问题。接着给出了完整的MATLAB代码来完成整个流程,从生成随机符号序列开始,经过调制、加入多普勒频移和噪声干扰,再到接收端进行下变频、匹配滤波、频偏估计与补偿,最终通过星座图、眼图和频谱对比展示了同步算法的效果。文中还特别强调了一些容易忽视的技术细节,比如pskmod函数的相位偏移设置、根升余弦滤波器的选择、频偏估计方法的选择等。 适合人群:对数字通信理论有一定了解并希望深入理解8-PSK调制解调机制及其同步算法的研究人员和技术爱好者。 使用场景及目标:适用于想要利用MATLAB工具探索8-PSK调制特性的人士,在无线通信领域特别是涉及高速移动环境下的信号传输研究中有重要应用价值。目的是帮助读者掌握8-PSK调制解调的具体实现步骤,同时学会如何应对由多普勒频移带来的挑战。 其他说明:文中提供的MATLAB代码可以直接用于实验验证,同时也为后续进一步优化提供了很好的起点。对于初学者来说,可以作为学习数字通信系统的基础教程;而对于有经验的研发人员,则能从中获得关于频偏补偿的新思路。

    Comsol仿真技术在PEM燃料电池堆热管理中的应用与建模实践 Comsol v1.0

    内容概要:本文详细介绍了利用Comsol仿真软件对聚合物电解质膜(PEM)燃料电池堆进行热管理建模的方法和技术。文中强调了保持电池单元间温度一致性的必要性,探讨了模型的具体构成,包括温度、电位、物质传递和流体流动的模拟。此外,还展示了Comsol大神们如何通过精确的数学模型和算法解决复杂物理问题,从而优化燃料电池堆的整体性能。 适合人群:从事燃料电池研究的科研人员、工程师及相关领域的学生。 使用场景及目标:适用于希望深入了解燃料电池堆内部工作机理及其热管理系统的人群,旨在提高燃料电池的设计效率和运行可靠性。 其他说明:随着清洁能源技术的发展,Comsol等专业仿真工具的应用将有助于推动燃料电池技术的进步,在未来的能源科技研究中扮演重要角色。

    基于Comsol的飞秒多脉冲激光烧蚀材料仿真:双温模型与PDE固体传热模型的应用

    内容概要:本文详细介绍了利用Comsol进行飞秒多脉冲激光烧蚀材料仿真的方法。首先,通过建立双温模型(电子温度和晶格温度)来模拟材料内部的能量传递过程,采用PDE模块和固体传热模型相结合的方式,实现了温度场和应力场的精确仿真。文中还提供了具体的数学表达式和建模步骤,如激光热源项的高斯型表达式以及双温方程的具体形式。此外,文章探讨了脉冲堆积效应对温度和应力的影响,并展示了如何通过后处理代码提取关键参数的数据,以便更好地理解和优化激光烧蚀效果。 适合人群:从事微加工领域的研究人员和技术人员,尤其是对激光烧蚀材料仿真感兴趣的科学家和工程师。 使用场景及目标:适用于需要精确模拟飞秒激光烧蚀材料过程中温度场和应力场变化的研究项目。主要目标是帮助用户理解双温模型的工作机制,掌握Comsol软件的操作技巧,从而优化激光加工工艺,提高加工质量和效率。 其他说明:文章强调了激光重复频率和脉冲能量之间的平衡关系,指出过高的频率可能导致热影响区面积增大,进而影响加工质量。因此,在实际应用中需要综合考虑多个因素,确保最佳的加工效果。

    TypeError Contract inherits from multiple base contracts with conflicting functions解决办法.md

    TypeError Contract inherits from multiple base contracts with conflicting functions解决办法.md

    实训商业源码-渔具产品网站源码-毕业设计.zip

    实训商业源码-渔具产品网站源码-毕业设计.zip

    Java设计服务】简易考勤系统:提供论文、源码及PPT.zip

    高质量大全套,这是我用过的,改改名字直接那去用就好了

    LBM多孔介质流动仿真:基于D2Q9模型的Matlab实现及泊肃叶流理论验证 - LBM

    内容概要:本文详细介绍了利用格子玻尔兹曼方法(LBM),特别是D2Q9离散化模型,在Matlab环境下对多孔介质内部单相流体流动进行仿真的全过程。主要内容涵盖:1) 使用QSGS算法生成随机多孔介质结构并优化孔隙形态;2) 设计合理的边界条件确保数值稳定性;3) 结合泊肃叶流理论公式验证模拟结果准确性;4) 基于达西定律计算渗透率评估模型性能;5) 提供了丰富的可视化手段如Paraview和Matlab内置绘图工具展示流场特征。文中不仅提供了完整的代码片段,还分享了许多实用的经验技巧,帮助读者更好地理解和应用这一先进的计算流体力学(CFD)方法。 适合人群:从事计算流体力学研究或工程应用的技术人员,尤其是希望深入了解LBM方法及其在多孔介质流动问题中应用的研究者。 使用场景及目标:适用于需要模拟复杂几何结构内流体行为的科研项目或工业设计任务,旨在提高对微观尺度下流固耦合作用机制的认识水平,为优化材料结构设计提供理论依据和技术支持。 其他说明:文章强调了理论与实践相结合的重要性,鼓励读者动手尝试代码实现,并通过调整关键参数探索不同条件下系统的响应规律。此外,还特别指出了一些容易被忽视但又至关重要的细节问题,如松弛时间的选择范围、边界条件的设定方式等,有助于初学者少走弯路。

Global site tag (gtag.js) - Google Analytics