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

代码文件

Objective-C的代码文件有3种,“*.h”的头文件;”*.m”是普通的源码文件,里面可包括Objective-C和C的代码;“*.mm”也是源文件的一种,里面可包括Objective-C,C和C++的代码。

最简单的HelloWorld

1 #import <UIKit/UIKit.h>
2 #import "HGAppDelegate.h"
3
4 int main(int argc, char *argv[])
5 {
6 printf("Hello world\n");
7 NSLog(@"Hello world");
8 }

代替了曾经熟悉的#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=12;
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#的keyword一样的,仅仅是多了个“@”,catch块中的@thorw仅仅是为了演示用。

在Objective-C中NSError让人的感觉与NSException类似,都是与错误有关,但实际上两者在使用方法上大有不同,NSException是异常,记录异常的信息,异常是在程序出现,会让程序卡住的。NSError是错误,是记录错误的信息,比如调用了某些方法失败后,会在传入方法的NSError对象中填写相关的错误信息,有NSError不会让程序卡死,但出现了NSException不捕捉则会让程序卡死,NSException能够被抛出和捕捉,NSError没有抛出和捕捉这个概念。

Objective-C语法简记学习的更多相关文章

  1. Dart 语法中文在线学习网址收藏

    为了学习flutter UI框架,必须先学好dart语言,故收藏了有关 Dart 语法中文在线学习网址 http://dart.goodev.org/guides/language/language- ...

  2. MongoDB(五)mongo语法和mysql语法对比学习

    我们总是在对比中看到自己的优点和缺点,对于mongodb来说也是一样,对比学习让我们尽快的掌握关于mongodb的基础知识. mongodb与MySQL命令对比 关系型数据库一般是由数据库(datab ...

  3. Objective-C语法简记

    开始学习iPhone开发了,虽然现在已经有了Swift,但我还是老老实实地学习Objective-C,鄙人入门的程序语言是C,后来学习了C#和Java,现在来学Objective-C,这篇只是一些很简 ...

  4. Delphi基础语法的学习笔记和注意事项总结

    以下是我在自学Delphi的时候,对一些注意点的简单总结,并没有什么系统性可言,只是一个学习时顺手记下的笔记,主要为了当时加深对知识的印象,并没有希望能在以后的复习和使用Delphi中有什么多大的参考 ...

  5. swift 语法 - 以及学习资料

    附上一些swift的一下学习资料: 1.Swift语法介绍官方英文版:The Swift Programming Language 2.Swift与Objective-C相互调用Using Swift ...

  6. sh语法入门学习

    玩linux都知道sh脚本的方便,但如何编写sh脚本却是像我这样的新手和菜鸟的难题.能不能编写得出来是一回事,了不了解又是另一回事.抱着好好学习,天天向上的精神,大家有空就看看吧,没有坏处的.下面来抄 ...

  7. SQLite Lemon 语法分析器学习与使用

    本文是浙江大学出版社的<LEMON语法分析生成器(LALR 1类型)源代码情景分析>学习笔记. 用到的Windows下的编译器介绍MinGW(http://www.mingw.org/): ...

  8. Python基础语法 系统学习

    Python 中的基础语法最大的特点就是优雅和简洁.入门学习Python的难度相比较其他语言也比较小. 我个人比较推荐以下三个学习方式(根据个人情况和喜好,可选择任意一个): 1.  菜鸟在线:出品的 ...

  9. word宏(macro) 之 注意事项,常见语法和学习地方

    宏:计算机科学里的宏(Macro),是一种批量处理的称谓.一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串).这种 ...

随机推荐

  1. poj3126解题报告

    题意:简单的说就是:有一个人门牌号是一个四位数的整数,并且还是一个素数,现在他想要换成另外一个四位数且是素数的门牌号,而且,每次都只能更换这个四位数的一个位置的数 ,也就是每换一次都只改变一个数字,而 ...

  2. 从零開始学android&lt;ImageSwitcher图片切换组件.二十六.&gt;

    ImageSwitcher组件的主要功能是完毕图片的切换显示,比如用户在进行图片浏览的时候.能够通过button点击一张张的切换显示的图片,并且使用ImageSwitcher组件在每次切换的时候也能够 ...

  3. Matlab hermite

    保形分段三次hermite插值 % 这是MATLAB里面的pchip.m文件.这里把它的凝视改写成汉语,主要是想弄清楚它是怎么计算在节点处的导数的. function v = pchip(x,y,xx ...

  4. hihoCoder #1174:拓扑排序&#183;一

    [题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 因为今天上课的老师讲的特别无聊.小Hi和小Ho偷偷地聊了起来. 小Ho:小Hi ...

  5. 你不知道的Eclipse的用法:使用MAT分析Android的内存

    如果使用DDMS确实发现了我们程序中存在内存泄露,那如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾分析代码逻辑,那肯定会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一个极好的 ...

  6. 13-7-5 android Tabhost功能实现

    开始使用了一个Activity做界面切换,采用visible.gone写法,感觉太麻烦了. layoutHousehold.setVisibility(View.GONE); layoutCamera ...

  7. CentOS tripwire-文件指纹

    Tripwire是目前最为著名的unix下文件系统完整性检查的软件工具,这一软件采用的技术核心就是对每个要监控的文件产生一个数字签名,保留下来.当文件现在的数字签名与保留的数字签名不一致时,那么现在这 ...

  8. 你怎么知道你的网站K

    最近有朋友问我关于网站K问题,你怎么知道被提及哪些网站K方面.总结了六个方法后,,至于有没有其他办法.欢迎和我交流讨论. 检测方法是网站的搜索引擎惩罚:   首先要明白的是.搜索引擎不惩罚easy侦查 ...

  9. Java引进和应用的包装类

    Java介绍包装类: 于Java它设计主张的想法,也就是说,一切都是对象.但是,我们知道,,Java数据类型分为基本数据类型和引用数据类型,但基本的数据怎么能成对象?为了解决这个问题,对需要8一个类的 ...

  10. 令人无限遐想的各种PCIe加速板卡

    声明 本文不涉及不论什么特定API,也不针对不论什么特定的厂商,可是仍然值得透露一点的是,某些加速板卡厂商的成功点和失败点恰恰都是在于其通用性,在这个人们依旧依赖专业板卡的时代,依旧将板卡视为解决专业 ...