Objective-C语法简记
开始学习iPhone开发了,虽然现在已经有了Swift,但我还是老老实实地学习Objective-C,鄙人入门的程序语言是C,后来学习了C#和Java,现在来学Objective-C,这篇只是一些很简略的笔记,不算是语法书。
代码文件
Objective-C的代码文件有3种,“*.h”的头文件;”*.m”是普通的源代码文件,里面可包含Objective-C和C的代码;“*.mm”也是源文件的一种,里面可包含Objective-C,C和C++的代码。
最简单的HelloWorld
#import <UIKit/UIKit.h>
#import "HGAppDelegate.h" int main(int argc, char *argv[])
{
printf("Hello world\n");
NSLog(@"Hello world");
}
取代了以前熟悉的#include预处理命令,换成了#import,但尖括号“<”,“>”还有双引号的意义与以前一样,printf语句依然能输入那句经典的Hello world,在Objective-C中就有了一种新的方式——NSLog(@"Hello world");大凡以NS前缀开头的类都是系统预先定义好的类,比如字符串NSString,后来的NSArray等。NSLOG传入了参数也是“Hello world”,但前面多加了一个@,这个是Objective-C字符串的写法,如果要声明一个字符串的变量并附初值@”Hello world”,则是
NSString *str=@”Hello world”;
基本数据类型
Objective-C的基本数据类型和C中的一样的,int是整形,char是字符,float是单精度浮点数,double是双精度浮点数,与C有点区别的在于short和long,这两种在Objective-C写法是short int和long int,在这里多了一个长双精度的类型long double。无符号的在前面多加了一个unsigned,写法如unsigned int。
特有数据类型
- Id 是指针类型,它的作用与C#/Java的Object类型很类似,可以指向任何引用类型的引用。
- BOOL 这类型只有两个值YES和NO,就代表着1和0。在C中这两个值也代表true和false。
- SEL 指向函数的指针,定义并附上初值的形式如下
SEL sel=@selector(方法签名)
或
SEL sel=NSSelectorFromString(方法名的字符串)
调用的时候则是以下形式
[obj performSelector:sel withObject: nil];
上面obj是对象的实例,sel则是SEL类型的变量,nil则是obj对象的默认值,如果保险起见,调用前要先判断obj对象有没有那个方法,则调用下面的方法,它会返回布尔值,ture就是存在,反之则不存在。
[obj respondsToSelector:sel]:
如果要获取SEL变量所指向的方法的方法名时,可以调用下面的方法,它返回的是一个字符串。
NSStringFromSelector(sel变量):
- nil,NiL和NSNull nil与C的NULL一样,是指向空的指针,它算是一个对象,一个什么都没有的对象;Nil则是代表空的类,是一个Class来的;NSNull出现在集合中,它代表着集合中空的元素。
流程控制语句
这里讲两种语句switch和foreach,因为这个在C#和Java之间都会有所区别。
- Switch,switch语句与C中里面的switch一样,每个case之后可以不需要用break;结束并跳出switch语句,它会顺序执行下一个case里面的代码,直到遇到了break或者到达语句末尾为止。这里的case后面与Java一样不能跟字符串。
- Foreach foreach语句与C#的形式很相像,也是foreach(元素类型 item in 集合的变量名)。在循坏体里面与C#不一样的是它能够去对被遍历的集合进行修改,但是由于更改后枚举器不会做相应的更新,所以如果删除了某些元素刚好被遍历到,有可能会出现空引用的异常。
类
Objective-C类的定义分声明与实现两个操作,感觉和接口的定义与实现很像。
- 类声明
@interface ClassName : NSObject
{
//字段定义
}
//方法,属性等其他成员的声明
@end
- 类的实现
@implementation ClassName
//方法,属性等其他成员的实现
@end
方法
方法的声明语法如下
+(void)methodName(paraType1)paraName1 and:(paraType2)paraName2;
+代表的是静态方法,-代表的是实例的方法;后面的括号代表的是返回类型,这里例如上面的方法是空返回void;方法名总在参数的前面,Objective-C的方法名很特殊,按上面声明的方法,它的方法名师methodName and;参数则是以 :(ParaType)ParaName的形式,如果没有参数,则方法名后面直接以分号“;”结束。调用则通过以下的形式,objIns则是对象的实例名。
[objIns methodName:value1 and:value2];
存取方法
对于私有字段而已要对其获取或设置都要通过get/set方法来进行,在Java中通过声明getter/setter方法来实现面向对象编程中的封装性,在Objective-C中也有这类getter/setter方法,称之为存取方法。
例如现在有字段int count,他对应的存取方法是
-(void) setCount: (int)couValue;
-(int) count;
Setter方法则是以set+对应的字段名,setter直接与字段同名。在调用的时候可以用通常方括号的形式”[” ”]”当不普通方法来调用,可以使用类似C#,Java中点”.”的方式调用,如果点的方式调用,则直接跟上字段的名字则可,如
MyClass.count=;
Int count=myclass.count;
属性
如果声明了一个属性,则系统会自动为其生成getter/setter方法。这个与C#的属性挺类似,但是语法形式大不相同。它与类的定义一样,分别有声明与实现两部分
- 声明
@property(修饰符) int count;
实现
@synthesize count;
如果在实现的时候要指定这个属性是对那个字段经行封装的,可以通过下面的形式,下面则代表了对count字段的封装,记得指定时有加下划线”_”
@synthesize count=_count;
在声明的时候可以指定修饰符,修饰符可以用多个,每个间用逗号隔开,修饰符及其作用如下所示
- Readwirte:可供读写;
- Readonly:只读;
- Strong:强引用,就是我们在C#和Java中通常使用的引用,就是指该对象在没有被任何一个字段引用才会被GC;
- Weak:弱引用,就算该对象有被字段引用着,还有可能会被GC;
- Copy:赋值的时候只给一个副本,不会给它本身;
- Assign:在通过setter赋值时不会增加该对象的引用计数器,这针对NSString类型和基础数据类型;
- Retain:调用时会释放前一个引用的对象,但是引用计数器会加1;
- Nonatomic:表明这个属性不考虑线程安全问题。
如果不使用系统自动生成的getter或setter方法,可以通过在修饰符的地方指定自己定义的getter方法和setter方法的签名,如
@property(getter=mygetter,setter=mysetter:) int count;
块
又叫作代码块,声明的语法如下
ReturnType(^BlockName)=^(paraType1 para1,paraType2 para2){ /*代码内容*/ };
等号左边相当于声明块的变量,等号右边相当于块的字面值,块的效果类似于Lumbda表达式,调用时就如C/C#中调用方法那样
BlockName(para1,para2);
协议
语法如下
@protocol ProtocoName //方法声明 @optional //可选实现 //方法声明 @required//必须实现 //方法声明 @end
这个类似于接口,实现是在类的声明处以下面的形式
@interface ClassName:NSObject<ProtocoName1,…..>
类别
语法如下
@interface ClassName(CategoryName) //方法声明 @end //其他代码 @implementation ClassName(CategoryName) //方法声明 @end
用于给已经定义的类扩展方法,ClassName是已经定义的类,要被扩展的类,CategoryName是类别名,类别中的方法如果遇到方法签名一样的方法,则会覆盖原有的方法;类别中的成员只局限于方法,字段那些是不能定义的;若是覆盖了方法,那么那个覆盖的作用域是整个程序。
Self与supper
- Self是类隐藏参数,类似Java与C#的this,调用方法时先向本类搜索方法,没有的话再向父类搜索。
- Super则是预编译指令,类似C#与Java的super,但是不完全一样,这里的super不代表对父类的引用,只是在调用方法时先从父类搜索,如果没有则再往父类的父类中搜索,只在调用方法时有C#/Java的效果,本质还是对当前类的引用。
内存管理
在开始时调用
NSAutoreleasePool *pool=[ [NSAutoreleasePool alloc] init];
结束的时候
[pool release];
构造对象
[[ClassName alloc] init];
释放对象
[ClassInsName release];
规则:1)自己用alloc或者copy创建的对象,在用完的时候要release;2)对不是自己创建的对象,则不要去release;3)retain对象后,要realease,两者要对称,有多少个retain就要有多少个release。
异常与错误
Objective-C的异常处理与C#和Java差不多,也是由try catch finally语句块组成,抛异常用throw。格式如下
@try
{ }
@catch(NSException *ex)
{
@throw
}
@finally
{ }
和C#的关键字一样的,只是多了个“@”,catch块中的@thorw只是为了演示用。
在Objective-C中NSError让人的感觉与NSException类似,都是与错误有关,但实际上两者在用法上大有不同,NSException是异常,记录异常的信息,异常是在程序出现,会让程序卡住的。NSError是错误,是记录错误的信息,例如调用了某些方法失败后,会在传入方法的NSError对象中填写相关的错误信息,有NSError不会让程序卡死,但出现了NSException不捕捉则会让程序卡死,NSException可以被抛出和捕捉,NSError没有抛出和捕捉这个概念。
Objective-C语法简记的更多相关文章
- Objective-C语法简记学习
開始学习iPhone开发了,尽管如今已经有了Swift,但我还是老老实实地学习Objective-C,鄙人入门的程序语言是C,后来学习了C#和Java,如今来学Objective-C,这篇仅仅是一些非 ...
- 初学Objective - C语法之代码块(block)
一.block声明 1.无参数,无返回值: void (^sayHi)(); 2.有参数,有返回值: NSInteger (^operateOfValue)(NSInteger num); block ...
- Markdown语法简记
目录 一.标题 1. 六个级别的标题 2. 主.副两级标题 二.根据标题生成文档结构大纲 三.字体 1. 斜体 2. 粗体 3. 倾斜加粗 4. 行首缩进 5. 删除线 四.引用块 五.代码块 1. ...
- markdown常用语法简记
一级标题 二级标题 三级标题 ..... 无序列表 First Second Third 有序列表 第一条 第二条 第三条 链接 我的github主页 锚点 无序列表 代码块 var vm = new ...
- [转] 从 C 到 Objective C 入门1
转自: http://blog.liuhongwei.cn/iphone/objective-c/ 进军iPhone开发,最大的难点之一就是怪异的Objective C语法了.不过,了解之后才发现,原 ...
- iOS开发——语法篇OC篇&高级语法精讲二
Objective高级语法精讲二 Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和 ...
- Windows下编译objective-C
Windows下编译objective-C 2011-08-31 14:32 630人阅读 评论(0) 收藏 举报 windowscocoa工具objective clibraryxcode 目录 ...
- ios学习笔记之2天来总结
学了2天,小结下. ios的基本代码执行流程: 与java的基本异同: 异: 1.基类:java中Object是所有类的父类,而objective-c的根类为NSObject 2.默认访问类型:jav ...
- Pentaho BI server 中 CCC table Component 的使用小技巧
我使用的版本 Pentaho BI Server 5.3.0.0.213 CDE/CDF/CDA/CCC 15.04.16 stable Q: 如何设置表格中各种提示文字的语言(默认为英语)? C ...
随机推荐
- 必须知道的SQL编写技巧,多条件查询不拼字符串的写法
在做项目中,我们经常遇到复杂的查询方法,要根据用户的输入,判断某个参数是否合法,合法的话才能当作过滤条件,我们通常的做法是把查询SQL赋值给一个字符串变量,然后根据判断条件动态的拼接where条件进行 ...
- [51单片机] 以PWM控制直流电机为例建一个简单的51工程框架
目录 1)功能概述 2)引脚连接 3)框架介绍 4)模块说明 5)复用规则 6)工程链接 1)功能概述 名称:独立按键控制直流电机调速 内容:对应的电机接口需用杜邦线连接到uln2003电机控制端; ...
- 换个角度理解云计算之MapReduce(二)
接上篇 3.Combiner操作 前面讲完Map操作,总结一下就是:一个大文件,分成split1~5,对应于Map1~5,每一个Map处理一个split,每一个split的每一行,会用每一个Map的m ...
- ueditor上传大容量视频报http请求错误的解决方法
故障现象: 当使用百度编辑器ueditor上传大容量视频或大容量图片的时候,编辑器报"http请求错误"的解决方法详解: 原因分析: 目前很多CMS整合了百度的ueditor编辑器 ...
- jQuery的attr与prop
jQuery1.6中新添加了一个prop方法,看起来和用起来都和attr方法一样,这两个方法有什么区别呢?这要从HTMl 的attribute与property区别说起,attr与prop正是这两个东 ...
- MYSQL-用户操作
说明:本文主要写了,MYSQL对于用户的一些操作,有:查看用户,创建用户,权限的赋予,收回,用户的密码修改和删除. MySql的用户管理是通过 User表来实现的,添加新用户常用的方法有两个,一是在U ...
- Linux gcc的安装
说明:我是在虚拟机里学习的Linux,很多问题也是和虚拟机有关的.今天就遇到了虚拟机安装gcc是一个问题. 首先查看gcc是否安装: 然后安装gcc.(我的错误就出现在这里.) 我用的虚拟机,练习平时 ...
- 开发人员应该对IIS理论层的知识了解的多一些~第四讲 HttpModule中的几大事件
返回目录 本文主要介绍HttpModule,它在一个网页请求过程中是一个怎样的过程是我们要知道的,在网页加载过程中HttpModule在何时被执行也是我们要知道的,以及,HttpModule在网页请求 ...
- atitit.js浏览器环境下的全局异常捕获
atitit.js浏览器环境下的全局异常捕获 window.onerror = function(errorMessage, scriptURI, lineNumber) { var s= JSON. ...
- SQL Pass北京举行2014年第一次线下活动
地点:北京微软(中国)有限公司[望京利星行],三层308室 时间:2014年 3 月15日 13:30-16:30 SQL PASS 北京QQ群号:2435349 报名地址:http://1drv.m ...