独特的@符号

首先,ObjectC是C的超集,为了不和C中已有的东西冲突,ObjectC中特有的东西前面都带有@符号

语法的差异

一、方法名

ObjectC中的方法名由多个段组成。

比如我们想初始化一个controller,最常用的是这个方法

initWithNibName:bundle:

看起来很奇怪是吧?方法具体签名如下

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

参数更紧接着调用的谓语,这样看起来更符合自然语法,在拥有多个参数的情况下即使没有对参数的说明,也非常容易记住。

中括号表达式:

一个中括号代表一次调用,看起来比较清晰。

具体调用如下:

[[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];

我们先是根据MyViewController类所需的大小分配了一块内存,然后发送消息去初始化这块内存。

因为方法名是包括:符号的,所以在通过selector选择方法的时候,:符号不能忘记

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

二、id

这类似于C中的通用指针void*,可以用来储存任何类的对象。也像C#中的dynamic关键字,就是告诉编译器在编译时无需检查这个变量的类型,运行的时候再检查确定。换句话说就是动态绑定。

在ObjectC中哪里会用到呢?

1.初始化的时候

ObjectC一个对象不能有两个名字相同的方法,即使他们的参数和返回类型不同。因此子类的init方法既不能返回子类,否则无法调用父类相同的init方法,当然也不能返回父类。

这时候就需要用到id这个通用的指针了。

2.不需要具体类型,只需要知道这个实例实现了某些方法。类似于C#中对接口编程的用法,常用声明delegate属性,以便使用不同的策略提供对象。

@property (nonatomic, weak) id<RequestDelegate> delegate;

需要提醒的是,虽然它可以存储任何类的对象,如果滥用它,就会失去静态类型时编译器所提供的好处。

三、强弱引用(strong, week; retain, assign)

是否加入引用计数的一种方式。iOS中没有自动垃圾回收机制,垃圾回收是根据引用计数来决定的。计数为0的时候会被认为垃圾马上回收掉。

在ARC的项目中

@property (strong, nonatomic) MyController *myController;

四、协议 (protocol)

类似于C#中的Interface,区别在于protocol中定义的方法可以选择不需要实现,也就是@optional的。当然如果没有标记那么就是必须实现的。

@protocol BoardActionDelegate<NSObject>@required- (void) selectPressed:(UIView *)sender;@optional- (void) cancelPressed:(UIView *)sender;@end

五、范畴(Categories)

1.命名范畴,类似于C#中的扩展方法,用于给已有的类扩展自定义的方法,区别在于ObjectC中不限制方法的类型,可以是实例或者是类方法。但是不能带成员变量。

比如说我们扩展UIColor类

@interface UIColor (Extract)- (void)extract_getRed;       @end

这类文件的命名最好为原类名 + 扩展类名,如 UIColor+Extract.h 、UIColor+Extract.m

2.类扩展(class extension),看起来就像一个没有名字的范畴。可以带变量成员,且必须实现。

如果根据良好的代码划分,我想放在头文件.h的往往是对外公开的方法和属性,而自己内部使用的私有方法就不需要放在头文件里。在像C#这种没有头文件的语言里,我们仍然会按照约定先写Public 方法,然后用#region 把它标记起来,方便别人查看。

假设我们有一个CarStock类,在CarStock.m中有如下代码,会遇到这么一个问题,如果init中调用的方法声明如果在init的位置下面,那么编译器就会报错,因为它是从上往下解析的.

- (id)init {        if ((self = [super init])) {            [self refreshStock];        }       return self;    }- (void)refreshStock {      // ...  }

这时有几种解决方式

1.refreshStock方法上移

2.refreshStock声明在头文件CarStock.h里

但这些都不符合我想要写一个私有方法的想法。ObjectC中方法是不带作用域声明的,也就是你无法像下面这样声明

private - (void)refreshStoc

所以可以在CarStock.m中,通过一个无命名的范畴,来解决这个问题

@interface CarStock ()- (void)refreshStock;       @end

Xcode 4.4版本(LLVM4编译器)后编译器新增的一些语法糖

Xcode是免费的,所以咱们可以升级到新版本来享受一下新编译器的一些好处

1.更加多的字面量支持

原来我们在ObjectC中创建一个NSString类型的对象时,可以

NSString *myName=@"langxue";

现在我们创建其他对象也可以字面量语法了

NSNumber *myNumber =@3;NSNumber *yesValue =@YES;NSArray *array =@[@1,@2,@3,@4];NSDictionary *dictionary =@[@"key1":@"value1"                  ,@"key2":@"value2"]

2.下标访问

我们可以通过下标来直接访问我们需要的元素,这在原来是不可以的。

int element3 = array[3]; int elementAt3 = dictionary [@"key3"]

3.自动合成@property

我们声明了property以后

@property (strong, nonatomic) MyController *myController;@property (nonatomic, copy) void (^completionHandler)();

原来的情况下访问器是通过@synthesize关键字合成的。

@synthesize myController = _myController;@synthesize completionHandler = _completionHandler;

有了新的LLVM编译器,就可以省略这些用于合成实例变量的代码了。LLVM 4编译器会自动合成这些实例变量。当然如果明确地写了get,set方法,LLVM 4就不再自动生成@synthesize指令了。需要记住的是,自动合成的实例变量会按照ObjectC中的惯例以下划线_开头。

转载于:https://www.cnblogs.com/madeininfi/p/3531677.html

【语法】iOS(一)ObjectC的语法相关推荐

  1. iOS战记 ----OC基础语法之战(一)

    iOS战记  ----OC基础语法之战(一) 一个机械设计者的转行之战. 火车一个年轻的程序员和一个项目经理登上了一列在山里行驶的火车,他们发现列车上几乎都坐满了,只有两个在一起的空位,这个空位的对面 ...

  2. Linux下的ATT语法(即GNU as 汇编语法)入门

    学习这么长时间,一直在C语言这一层面上钻研和打拼,日积月累,很多关于C的疑惑在书本和资料中都难以找到答案.程序员是追求完美的一个种群,其头 脑中哪怕是存在一点点的思维黑洞都会让其坐卧不宁.不久前在it ...

  3. 【Groovy】Groovy 方法调用 ( 字符串切割 | 使用 Java 语法切割字符串 | 使用 Groovy 语法切割字符串直接为变量赋值 | 数组赋值给变量 变量个数小于等于数组长度 )

    文章目录 一.字符串切割 1.使用 Java 语法切割字符串 2.使用 Groovy 语法切割字符串直接为变量赋值 3.数组赋值给变量 变量个数小于等于数组长度 二.完整代码示例 一.字符串切割 在 ...

  4. JavaScript学习笔记01【基础——简介、基础语法、运算符、特殊语法、流程控制语句】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

  5. easypoi 语法_高考阅读amp;语法填空amp;完型amp;词汇amp;句型amp;翻译amp;语法 系列大合集 找资料不愁了...

    阅读高考英语阅读理解100篇高中英语阅读理解各大题型+解题技巧,非常实用! 语法填空 1高考英语语法填空题考点分析与解题技巧 22020高考语法填空练习11套 3"语法填空+短文改错&quo ...

  6. lr 1 语法分析器c语言,LR语法分析器

    1 LR语法分析器 本节介绍一个有效的自底向上的分析技术,可以用于一大类上下文无关文法的语法分析.这种技术叫做LR(k)分析法,其中L表示从左到右扫描输入串,R表示构造一个最右推导的逆过程,k指的是在 ...

  7. easypoi 语法_语法微课初中英语语法复习大全

    关注星标英语导学,每天与你相约中考语法微课 (点击标题观看) 英语句式的讲解微课(一) 英语句式的讲解微课(二) 时态语态微课(一) 时态语法微课(二) 初中英语时态教学微课视频 及物动词与不及物动词 ...

  8. notepad++调用VIVADO语法检测工具进行verilog语法检测

    Notepad++ 色彩过于明显,已不再使用该编辑器 Notepad++安装NppExec插件 在notepad++界面中选择 插件>插件管理>安装NppExec 获取VIVADO语法检测 ...

  9. 谷歌搜索语法(二)高级语法

    Google搜索语法(二)高级语法 接上篇:谷歌搜索语法(一)基本语法 通过上一篇博客,我们介绍了google的基本搜索语法,在生活中合理的运用这些搜索语法就可以协助我们更加精确.高效的找到我们想要的 ...

  10. JLPT一级语法桌面(105条语法)

    完整的JLPT一级语法桌面(105条语法)

最新文章

  1. 冲出UAC-解决Win UAC问题的编程经验
  2. INNODB 热备工具试验与总结
  3. ApplicationIdle
  4. 函数指针数组在ARM异常中断处理中的应用
  5. ddr test DCD CFG file CBT
  6. 对反向传播算法(Back-Propagation)的推导与一点理解
  7. Android UI布局之LinearLayout
  8. 使用C# 探索 ML.NET 中的不同机器学习任务
  9. 【C语言进阶深度学习记录】十九 #pragma使用与分析
  10. 环形数组求最大子数组之和
  11. ios开发快速入门教程
  12. 互联网晚报 | 7月27日 星期三 | 微信安装包11年膨胀575倍;阿里申请香港纽约双重主要上市;苹果应用商店被曝大量色情应用...
  13. 什么快捷键切换仅计算机,什么是电脑屏幕切换快捷键
  14. 有关SoftICE的详细操作指导教程
  15. java mail类_Java Mail工具类
  16. [内存泄漏]pppd程序导致的内存泄漏
  17. C++保留小数点后两位
  18. 计算机用函数怎么不能求平均值,Excel里怎么求平均数的?函数是什么?
  19. 机器学习(周志华) 第九章聚类
  20. 项目体系架构设计——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(四)

热门文章

  1. 云之讯 亿美 短信的三方接口
  2. [SCOI2005][BZOJ 1084]最大子矩阵
  3. WebSocket请求过程分析及实现Web聊天室
  4. 思维导图中的快捷键分享
  5. java String.replaceAll中特殊字符问题
  6. GlusterFS集群文件系统
  7. mysql5.6主从复制与基于amoeba实现读写分离
  8. 酸奶小妹升级成酸奶妈妈了!
  9. 【细节处理】LeetCode 66. Plus One
  10. 剑指offer——面试题22:栈的压入、弹出序列