一、第一个oc程序

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
NSLog(@"Hello, Objective-C");
return 0;
}

运行,控制台输出

二、声明变量使用类型关键字(int/float/long/BOOL/char等)

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
int num = 100;
NSLog(@"Number is: %i", num);
return 0;
}

运行,控制台输出

JS中声明变量只用var,无论何种数据类型。

三、块级作用域

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
int num = 100;
if (num > 99) {
int secondNum = 200;
NSLog(@"Number is: %i", num);
NSLog(@"Number is: %i", secondNum);
}
NSLog(@"Number is: %i", num);
NSLog(@"Number is: %i", secondNum); // 错误,编译器会提示
return 0;
}

JS中没有块级作用域。 

四、static关键字

前面的局部变量通常都在每次程序进入该局部变量的作用域时分配并在离开时释放。这类存储称为自动存储(默认关键字auto)。

static关键字会在声明变量的时候分配内存,在程序运行期间只分配一次内存。之后再访问时,实际都是在访问原先分配的内存。这适合用于存储创建时使用大量的资源,并且不常改变的局部变量。

void func() {
static Expensive * p = [[Expensive alloc] init];
[p doSomeOp];
}
int main(int argc, const char * argv[])
{
func(); // 第一次调用时创建 p
func(); // 第二次调用,此时p已存在,不会再次创建
return 0;
}

因为全局变量默认位于全局作用域中,所以其行为和静态变量一样。也就是说,它们只分配一次内存,并在整个程序运行期间保持不变。

JS中,未在function内声明的或未使用var声明的变量都是全局变量。

五、const关键字

const同样会修改所声明变量的内存行为,它所修饰的变量是只读的,即第一次初始化后它的值将不能改变。通常用来声明常量

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
const NSString *str = @"BeiJing";
str = @"ShangHai"; // 会产生一个编译错误
NSLog(@"dd, %@", str);
return 0;
}

JS规范ES6中也增加了const关键字,Firefox/Chrome/Safari的最新版已经支持。node v0.8+ 也支持。

六、结构体

结构体算是一种复合数据类型,对象也是。复合数据类型由基本类型组成。定义结构体使用struct关键字

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
// 定义一个结构体
struct Point {
int x;
int y;
}; // 使用结构体类型
struct Point p1;
struct Point p2; // 赋值使用点操作符
p1.x = 0;
p1.y = 0;
p2.x = 1;
p2.y = 1; // 假设有个写好的函数moveFromTo
moveFromTo(p1, p2); // 从坐标中心点移动到(1,1)点
return 0;
}

JS没有所谓的结构体,但这里的点操作符类似与JS对象取属性操作符。OC对象调用时却不是使用点操作符。

七、类型定义 typedef (type definition)

结构体每次使用时都需要输入struct Point,很无聊。typedef则省去了该步骤,更简洁。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
// 定义一个类型
typedef struct{
int x;
int y;
} Point; // 使用类型, 省去了struct
Point p1;
Point p2; // 赋值使用点操作符
p1.x = 0;
p1.y = 0;
p2.x = 1;
p2.y = 1; // 假设有个写好的函数moveFromTo
moveFromTo(p1, p2); // 从坐标中心点移动到(1,1)点
return 0;
}

这里,Point变为了“一等类型”,和int一样在任何地方都可以用。注意,和struct一样定义的是纯数据类型,没有操作(方法)。

JS没有typedef(倒是有一个typeof), JS的function可以来定义一个纯数据(this, prototype挂基本类型)。

八、

oc-基本语法的更多相关文章

  1. 【OC基础语法考试】

    OC基础语法已经全部学完,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.接下来我会总结前面的OC基础语法,如果大家发现有什么不正确的地方,请指正,小弟是新生,多请 ...

  2. OC点语法和变量作用域

    OC点语法和变量作用域 一.点语法 (一)认识点语法 声明一个Person类: #import <Foundation/Foundation.h> @interface Person : ...

  3. 李洪强iOS开发之OC点语法和变量作用域

    OC点语法和变量作用域 一.点语法 (一)认识点语法 声明一个Person类: 1 #import <Foundation/Foundation.h> 2 3 @interface Per ...

  4. [Objective-c 基础 - 2.2] OC弱语法、类方法

    A.OC弱语法 1.在运行的时候才会检查方法的声明和实现 2.没有声明只有实现的方法也能正常运行,只要在调用之前定义即可 3.类的声明必须存在,否则会出现运行时错误   B.类方法 1.是类名调用的方 ...

  5. 【Objective-C】1.oc点语法

    在Java中,我们可以通过"对象名.成员变量名"来访问对象的公共成员变量,这个就称为"点语法".比如: 1.在Student类的第2行定义了一个公共的成员变量a ...

  6. IOS基础之 (一) OC基础语法

    一 OC语法 1.关键字 基本上所有关键字都是以@开头,比如: @interface , @implementation, @end, @public, @protected, @private 2. ...

  7. iOS - OC 面向对象语法

    1.类 1)根类:因为类 NSObject 是层次结构的最顶层,因此称为根类. 可以将类称为子类(subclass)和父类(superclass),也可以将类称为子类和超类. 2)分类/类别(cate ...

  8. OC特有语法:分类category,给NSString增加方法计算字符串中数字的个数

    1:分类的使用场景:想对一个类,扩充一些功能,而又不改变原来类的模型,也不用继承,这时OC中的特有语法:分类可以做到: 当然分类也是一个类,也需要声明和实现,声明在.h文件中,实现在.m文件中,格式如 ...

  9. OC - 4.OC核心语法

    一.点语法 1> 基本使用 点语法本质上是set方法/get方法的调用 2> 使用注意 若出现在赋值操作符的右边,在执行时会转换成get方法 若出现在赋值操作符的左边,在执行时会转换成se ...

  10. iOS开发——OC篇&OC高级语法

    iOS开发高级语法之分类,拓展,协议,代码块详解 一:分类 什么是分类Category? 分类就是类的补充和扩展部分 补充和扩展的每个部分就是分类 分类本质上是类的一部分 分类的定义 分类也是以代码的 ...

随机推荐

  1. Python入门笔记(15):对文件的操作(1)

    一.文件对象 我理解的文件对象就是一个接口,通过这个接口对文件进行相关操作. <Python 核心编程>上说的很晦涩,这里没有深刻理解到,希望有人能解释给我听. >>> ...

  2. asp.net学习之Repeater控件

    asp.net学习之Repeater控件 文章摘自:http://www.cnblogs.com/shipfi/archive/2009/10/19/1585703.html Repeater控件和D ...

  3. WebApi传参总动员(四)

    前文介绍了Form Data 形式传参,本文介绍json传参. WebApi及Model: public class ValuesController : ApiController { [HttpP ...

  4. R语言-简单线性回归图-方法

    目标:利用R语言统计描绘50组实验对比结果 第一步:导入.csv文件 X <- read.table("D:abc11.csv",header = TRUE, sep = & ...

  5. [moka同学笔记]YII2中发送邮件示例(转载)

    原文:http://yiilib.com/topic/675/Yii2%E4%B8%AD%E5%8F%91%E9%80%81%E9%82%AE%E4%BB%B6%E7%A4%BA%E4%BE%8B { ...

  6. js 创建对象 经典模式

    1. 概述 通过构造函数创建对象, 有时忘记了写new, 这时函数就会返回undefined 可以创建一个函数createXXX, 在内部封装new. function Student(props){ ...

  7. LGLSearchBar

    平时我们都是用UITextFeild 来写搜索框, 最近有时间就自己重新封装了UISearchBar, 他可以自行修改里面的属性来达到我们使用的要求. 源代码下载地址:https://github.c ...

  8. ahjesus C# Flags 位域略说

    class Program { [Flags] public enum Week { [Description("星期一")] Monday = << , [Descr ...

  9. Android系统兼容性问题(持续更新)

    相信开发过一段Android的都被Android中的兼容性问题给折腾过,有时这确实很无奈,Android被不同的厂商改的七零八落的.本文主要总结下本人在实际的项目开发过程中所遇到的兼容性问题,以及最后 ...

  10. 硅谷新闻2--禁止viewpager预加载

    ContentFragment.java class MyOnPageChangeListener implements ViewPager.OnPageChangeListener { ..... ...