开始学习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语法简记的更多相关文章

  1. Objective-C语法简记学习

    開始学习iPhone开发了,尽管如今已经有了Swift,但我还是老老实实地学习Objective-C,鄙人入门的程序语言是C,后来学习了C#和Java,如今来学Objective-C,这篇仅仅是一些非 ...

  2. 初学Objective - C语法之代码块(block)

    一.block声明 1.无参数,无返回值: void (^sayHi)(); 2.有参数,有返回值: NSInteger (^operateOfValue)(NSInteger num); block ...

  3. Markdown语法简记

    目录 一.标题 1. 六个级别的标题 2. 主.副两级标题 二.根据标题生成文档结构大纲 三.字体 1. 斜体 2. 粗体 3. 倾斜加粗 4. 行首缩进 5. 删除线 四.引用块 五.代码块 1. ...

  4. markdown常用语法简记

    一级标题 二级标题 三级标题 ..... 无序列表 First Second Third 有序列表 第一条 第二条 第三条 链接 我的github主页 锚点 无序列表 代码块 var vm = new ...

  5. [转] 从 C 到 Objective C 入门1

    转自: http://blog.liuhongwei.cn/iphone/objective-c/ 进军iPhone开发,最大的难点之一就是怪异的Objective C语法了.不过,了解之后才发现,原 ...

  6. iOS开发——语法篇OC篇&高级语法精讲二

    Objective高级语法精讲二 Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和 ...

  7. Windows下编译objective-C

    Windows下编译objective-C 2011-08-31 14:32 630人阅读 评论(0) 收藏 举报 windowscocoa工具objective clibraryxcode   目录 ...

  8. ios学习笔记之2天来总结

    学了2天,小结下. ios的基本代码执行流程: 与java的基本异同: 异: 1.基类:java中Object是所有类的父类,而objective-c的根类为NSObject 2.默认访问类型:jav ...

  9. Pentaho BI server 中 CCC table Component 的使用小技巧

    我使用的版本 Pentaho BI Server 5.3.0.0.213 CDE/CDF/CDA/CCC 15.04.16 stable   Q: 如何设置表格中各种提示文字的语言(默认为英语)? C ...

随机推荐

  1. 必须知道的SQL编写技巧,多条件查询不拼字符串的写法

    在做项目中,我们经常遇到复杂的查询方法,要根据用户的输入,判断某个参数是否合法,合法的话才能当作过滤条件,我们通常的做法是把查询SQL赋值给一个字符串变量,然后根据判断条件动态的拼接where条件进行 ...

  2. [51单片机] 以PWM控制直流电机为例建一个简单的51工程框架

    目录 1)功能概述 2)引脚连接 3)框架介绍 4)模块说明 5)复用规则 6)工程链接 1)功能概述 名称:独立按键控制直流电机调速 内容:对应的电机接口需用杜邦线连接到uln2003电机控制端; ...

  3. 换个角度理解云计算之MapReduce(二)

    接上篇 3.Combiner操作 前面讲完Map操作,总结一下就是:一个大文件,分成split1~5,对应于Map1~5,每一个Map处理一个split,每一个split的每一行,会用每一个Map的m ...

  4. ueditor上传大容量视频报http请求错误的解决方法

    故障现象: 当使用百度编辑器ueditor上传大容量视频或大容量图片的时候,编辑器报"http请求错误"的解决方法详解: 原因分析: 目前很多CMS整合了百度的ueditor编辑器 ...

  5. jQuery的attr与prop

    jQuery1.6中新添加了一个prop方法,看起来和用起来都和attr方法一样,这两个方法有什么区别呢?这要从HTMl 的attribute与property区别说起,attr与prop正是这两个东 ...

  6. MYSQL-用户操作

    说明:本文主要写了,MYSQL对于用户的一些操作,有:查看用户,创建用户,权限的赋予,收回,用户的密码修改和删除. MySql的用户管理是通过 User表来实现的,添加新用户常用的方法有两个,一是在U ...

  7. Linux gcc的安装

    说明:我是在虚拟机里学习的Linux,很多问题也是和虚拟机有关的.今天就遇到了虚拟机安装gcc是一个问题. 首先查看gcc是否安装: 然后安装gcc.(我的错误就出现在这里.) 我用的虚拟机,练习平时 ...

  8. 开发人员应该对IIS理论层的知识了解的多一些~第四讲 HttpModule中的几大事件

    返回目录 本文主要介绍HttpModule,它在一个网页请求过程中是一个怎样的过程是我们要知道的,在网页加载过程中HttpModule在何时被执行也是我们要知道的,以及,HttpModule在网页请求 ...

  9. atitit.js浏览器环境下的全局异常捕获

    atitit.js浏览器环境下的全局异常捕获 window.onerror = function(errorMessage, scriptURI, lineNumber) { var s= JSON. ...

  10. SQL Pass北京举行2014年第一次线下活动

    地点:北京微软(中国)有限公司[望京利星行],三层308室 时间:2014年 3 月15日 13:30-16:30 SQL PASS 北京QQ群号:2435349 报名地址:http://1drv.m ...