objective-c 语法快速过(1)
有一定 c++或者 java 基础,过一遍 oc 语法即可,都是相通的,个人认为难点是 oc 的内存管理,虽然有了 ARC,但是也需要学习下,因为有旧软件的维护。
建立在C语言的基础上,增加了一层小范围的面向对象的语法(保留了面向对象最精华的部分,oc的内容没有java多,而java的内容没有c++多,c++的内容最为繁杂),OC完全兼容C语言,c和oc可以混编。可以在OC代码中混入C语言代码(前提是oc源文件扩展名是.m),甚至是C++代码(不是所有的源文件都能包含c++代码,只有源文件扩展名是.mm的源文件可以包含c++代码)。
可以使用OC开发Mac OS X平台和iOS平台的应用程序
关键字
基本上所有关键字都是以@开头,一些常见的关键字
@interface、@implementation、@end、@public、@protected、@private、@selector、@try、@catch、@throw、@finally 、@protocol、@optional、@required、@class、@property、@synthesize、@dynamic、self、super、id、_cmd、__block、__strong、__weak
字符串以@开头
比如@"Hello"是OC中的字符串,而"Hello"则是C语言中的字符串,其中,@和字符串必须紧挨着。
注释
注释的语法和C 一样。
nil
OC 中的 nil 相当于 c 和 c++的NULL
OC程序的开发过程
编辑,编译,链接(把所有的相互关联的.o文件合并在一起,加上函数库),运行。
和c类似,先编写.m文件(文件名可以是中文),然后编译器编译,链接,运行。
NSLog与printf的区别
1、NSLog接收OC字符串作为参数,printf接收C语言字符串作为参数
2、NSLog输出后会自动换行,printf输出后不会自动换行
3、使用NSLog需要#import <Foundation/Foundation.h>,里面有NSLog函数的声明。不需要刻意记忆,想不起来,就编译,出错就会提示缺少什么。
4、可以只包含框架的主头文件,效果等价包含了这个框架里的所有的头文件。头文件在Xcode里面,路径很深,不好找。使用printf需要#include <stdio.h>
#import的作用(预处理)
1、跟#include一样,用来拷贝某个文件的内容
2、可以自动防止文件内容被拷贝多次,也就是头文件中不用和C一样,加入下面的预处理指令了
#ifndef xxx xxx #define xxx xxx #endif
Foundation框架的作用
开发iOS、Mac程序必备的框架,此框架中包含了很多常用的API。框架中包含了很多头文件,若想使用整个框架的内容,包含它的主头文件即可
#import <Foundation/Foundation.h>
相当于#include 导入头文件 也有两种查找方式< ... > 和" ... "。
当包含一个头文件,编译时,需要找到那个头文件,使用< >这种方式,编译器查找的时候,会在编译器的安装目录的标准库中开始查找," "这种方式,会在当前的工程所在的文件夹开始寻找,也就是源程序所在的文件夹。有的编译器,要求十分严格,不能混用,有的就可以。
BOOL的使用(完全可以当做整型用)
BOOL类型的本质:
typedef signed char BOOL;
BOOL类型的变量只有两种取值:YES、NO
#define YES (BOOL)1 #define NO (BOOL)0
BOOL的输出(当做整数来用);
NSLog(@"%d %d", YES, NO);//1 0
C里没有布尔类型,c++,java里有,oc也有。不过oc的布尔和c++有区别,在C++里一切非 0 值的东西都为 true,而为0值的为false。但是Object-c里必须是1为 true ,且并被宏定义为 YES,0 为 false 并被宏定义为 NO。
所以下面的代码,则肯定是得不到想要的运行顺序。
1 #import <Foundation/Foundation.h>
2 BOOL isBool(int, int);
3
4 int main(void)
5 {
6 if (isBool(5, 1) == YES) {
7 NSLog(@"ok");
8 }
9 return 0;
10 }
11 BOOL isBool(int x, int y)
12 {
13 return x - y;
14 }
4不是1,在oc里永远都不会等于YES(因为 oc 中的YES就是1),注意:BOOL大写,YES 和 NO 也是大写,OC 里的YES就是1,NO就是0
多个.m文件的开发和混合开发
跟C语言中多文件的开发是一样的,回忆c多文件开发,常量的定义或者函数的声明写在xxx.h文件,函数的定义写在xxx.c文件,主文件main.c里写主程序和函数调用,最后#include xxx.h文件,一起编译主文件main.c和xxx.c文件即可。
面向对象常用术语
- 面向过程 Procedure Oriented
- 面向对象 Object Oriented,简称OO
- 面向对象编程 Object Oriented Programming,简称OOP
OC中的面相对象
1) 类相当于图纸,用来描述一类事物。
2) 利用类来创建对象,对象是类的具体存在
3) 因此,面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象
定义OC的类和创建OC的对象
定义一个新类分为 2 部分:
@interface 部分;
描述类、类的数据成分以及类的方法
@implementation 部分;
实现这些方法的实际代码
@interface 部分的一般格式:
@interface NewClassName : ParentClassName { memberDeclarations; } methoddeclarations; @end
@implementation 部分的一般格式:
@implementation NewClassName methodDefinitions;
@end
//NewClassName 表示的名称与@interface 部分的类名相同
要描述类分2大步骤:类的声明、类的实现(定义)。
跟函数类似,函数也分声明和定义。而声明一个类又需要三大要素:类名,属性,行为,类似 c++。
命名规则:
以字母或下划线开头,之后可以是任何字母,下划线或者0~9 数字组合。
约定:
类名以大写字母开头,命名有意义、比如驼峰标识。
实例变量、对象以及方法的名称以小写字母开始。每次创建新对象时,将同时创建一组新的实例变量且唯一。
注意:在对象类型的右边都有一个 *号,所有的对象变量都是指针类型。
id (万能指针)类型已经被预定义为指针类型,所以不需要加一个*号。
- 类的声明,关键字@interface后一个空格,跟一个类名,然后最后必须写@end,告诉编译器类声明完毕
- 类的声明用来声明对象的属性(成员变量,也叫实例变量)和行为(方法)
- : NSObject 继承一个类(在Foundation框架里)
- 花括号里用来写对象属性,不能写方法
- 方法(行为);写在花括号外,@end 前
三要素:方法名,参数,返回值(类似函数,分声明和实现),方法的声明在类的声明里,且不能写在花括号里。
方法虽然类似c的函数,但是和函数千差万别
只要方法是对象的方法,则声明前必须加一个减号-,这是规则!
oc方法里的任何数据类型都必须用小括号()括起来
oc方法的小括号就一个作用,就是括住数据类型的。故- (void) run();是不对的!
类的实现,类似于类的声明语法,也要写@end
对象里的成员变量,可以取值整型的,那么默认初始化为0
oc方法的实现,必须写在类的实现里,说清楚方法里有什么。
方法开头的(-)号或者(+)号表示:
(-) 该方法是实例方法(对类的特定实例执行一些操作) ;
(+)是类方法(即对类本身执行某些操作的方法,例如创建类的新实例)
oc 一般的方法的声明示例:
-(void)setNumerator :(int)n
第一个表示方法类型(对象方法-),返回类型(空void),接着是方法名(包括冒号:),方法接受的参数类型int和参数名n
注:如果不带参数则不用使用“:”号
如果没有指定任何返回类型, 那么默认是id类型, 所有的输入参数默认也是id类型 (id类型可用来引用任何类型的对象,属于万能指针类型) 。
oc 里具有多个参数的方法声明示例:
-/+ (return type) function_name : (parameter type) parameter1 otherParameter : (parameter_type) parameter2;
如果只有一个参数,在: 后面声明参数的类型和名称
如果有多个参数的话,每个参数前面都要有一 个 :,接着是参数类型和参数名称。
在 objective c 中,对于有多个参数的函数,可以理解为将函数的名称拆 成了几个部分,每个部分都是对紧接着的参数的一个解释 ,非常方便,做到见名知意,oc 官方文档也是,尤其带多个参数的方法名字往往特别的长。
如在 C++中多个参数的方法声明:
void initializeRectangle(int x1, int y1, int x2, int y2);
但并不知道这些参数都是什么意思,但在objective-c 中,可以这样声明:
void initializeRectange: (int)x1 LeftUpY :(int)y1 RightBottomX: (int)x2 RightBottomY:(int)y2;
利用类创建对象
oc里,想执行一些行为,必须写上一个中括号[],方括号左面是类的名称或者该类实例的名称,空格后面是方法(即消息)
[classOrInstance method];
执行Car这个类的new行为来创建对象,分配了内存,每个对象都有自己的存储空间来存储自己的成员变量等元素
youCar = [Car new];//创建了一个Car类的对象,返回对象的地址(返回对象)。之后内存里存在这个对象了。
oc里想操作对象,只能用指针去间接操作!
Car *p = [Car new];//把地址保存到指针里,p指向的是Car类型的对象
给p指向的对象的属性赋值
p->speed = ;
内存分析(对象在内存中有成员)
[Car new]每次都会创建出新的对象,并且返回对象的地址,那么就应该用一个指针变量保存对象的地址
Car *c = [Car new];//用一个指针变量c指向内存中的Car对象
设置车子对象的属性,跟用指向结构体的指针访问结构体属性一样,用->
c->wheels = 3;
c->speed = 300;
对象在内存里的变化和状态图
oc 类成员的访问属性:
oc类属性,默认是@protected,本类内部和继承的类能访问,而外部无法访问,需要手动设置为public。
@pubic
有一个典型的错误
oc千万不能想当然的和c++,java混淆,不用在类实现里再添加花括号了,直接写方法的实现即可。
和c++的不同,oc的类占据一份内存空间!
在第一次使用类的时候,类被加载到内存里,即在创建对象之前,先给类分配内存空间。
1、存放类的内存只被加载一次(第一次使用对象的时候,加载对象属于的类)即可,且里面只存放方法的列表。
2、内存里每个类的对象的存储空间内部,默认都有一个指针叫isa指针,每个对象都有,作用是:指向这个对象所对应的类(存放类的内存块,帮助找到对象所属的类),所以所有的对象都共用一份方法,所以类只被加载一次即可。成员变量每个对象都有自己的那一份内存,但是方法就共用一份内存
3、调用方法的过程:
[person1 walk];
执行:
给指针person1指向的对象发送一条walk消息,去调用那个对象的walk方法,然后对象会顺着isa指针找到对应的类,去类里找方法,找到walk方法,就前往对应的代码去执行,就在walk方法里访问当前对象的成员变量age和weight(因为成员变量,每个对象都有自己的一份)
再次强调:将对象赋给id类型变量不会有问题。
注:无论在哪里,对象总是携带它的isa的保护成员(一个指针,可以用来确定对象所属的类) ,所以即使将它存储在id类型的通用对象变量中,也总是可以确定它的类 。
面向对象封装的好处
- 更加接近人类的思考方式
- 只需要关注对象,不需要关注步骤
- 但是注意:oc的对象不会自动去回收,一旦创建,一直存在内存里,除非手动释放,或者程序执行完毕。所以,函数创建的对象不会消失。但是没有指向它的指针存在了。
- 注意,oc 里,方法和函数是有本质的区别的,不要混淆!
欢迎关注
dashuai的博客是终身学习践行者,大厂程序员,且专注于工作经验、学习笔记的分享和日常吐槽,包括但不限于互联网行业,附带分享一些PDF电子书,资料,帮忙内推,欢迎拍砖!
objective-c 语法快速过(1)的更多相关文章
- Objective-C基础语法快速入门
Objective-C基础语法快速入门 2010-11-04 16:32 折酷吧 zheku8 字号:T | T 假如我们对面向对象的思维已经C语言都很熟悉的话,对于我们学习Objective-C将会 ...
- jenkins2 pipeline 语法快速参考
jenkins2 pipeline中常用的语法快速参考. 文章来自:http://www.ciandcd.com文中的代码来自可以从github下载: https://github.com/ciand ...
- Razor 语法快速参考
Razor 语法快速参考 本文引自:http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx 语法名称 Raz ...
- 第二章 C#语法快速热身
C#语法快速热身 语法 if(条件表达式){ 代码块 } 语法 if(条件表达式){ 代码块 }else{ 代码块2 } 语法 if(条件表达式1){ 代码块1 if(条件表达式1)){ }else{ ...
- Less 语法快速入门
Less 语法快速入门 Less 是一门 CSS 预处理语言其可以运行在 Node 或浏览器端. 它将传统的 css 样式结构单一的排版顺序进行了优化,让我们可以通过层级嵌套的方式将 css 类名与H ...
- objective-c 语法快速过(6)内存管理原理
内存管理基本原理(最重要) 移动设备的内存极其有限(iphone 4内存512M),每个app所能占用的内存是有限制的(几十兆而已). 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不 ...
- objective-c 语法快速过(4)
oc 里的字符串 字符串的快速创建(最简单的方法) NSStirng *str = @“Hello”;//oc的字符串都是@“”形式的 oc的字符串也是类的对象,是NSString类的对象,创建没有那 ...
- Emmet语法 —— 快速生成HTML结构
快速生成HTML结构语法 1.生成单个标签 : 标签名+tab,比如 div 然后tab 键, 就可以生成 <div></div> 2.生成多个相同标签 div*3 + tab ...
- objective-c 语法快速过(8)
Block(oc 的数据类型,很常用,本质是c结构体) 类似内联函数,从源代码层看,有函数的结构,而在编译后,却不具备函数的性质.编译时,类似宏替换,使用函数体替换调用处的函数名 Block封装了一段 ...
随机推荐
- Spring的三种通过XML实现DataSource注入方式
Spring的三种通过XML实现DataSource注入方式: 1.使用Spring自带的DriverManagerDataSource 2.使用DBCP连接池 3.使用Tomcat提供的JNDI
- HDU(1285)—确定比赛名次
/*最近都在复习期末了...好久没做题,都快没智商了*/ 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后 ...
- *HDU1850 博弈
Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32 ...
- JavaScript资源大全中文版(Awesome最新版--转载自张果老师博客)
JavaScript资源大全中文版(Awesome最新版) 目录 前端MVC 框架和库 包管理器 加载器 打包工具 测试框架 框架 断言 覆盖率 运行器 QA 工具 基于 Node 的 CMS 框 ...
- 第一章-第十五题(谈谈你对压力的看法,以及怎么和别人合作, 帮助别人,把压力转化为动力,在互相帮助的环境中成长。)--By林培文
压力是一把双刃剑,有害也有利,重点是如何看待压力,从而做到趋利避害,化压力为动力.对于当前的我来说,压力利大于弊.形成这一想法,我经历了好几个阶段.第一个阶段是小学时代,那会整天就知道玩,也没什么压力 ...
- eclipse创建Maven-web项目(-)
一.new----other----maven----maven project 二.next 三.next(选择maven-archetype-webapp) 四.填写相应的信息,Packaged是 ...
- Haskell 函数式编程快速入门【草】
什么是函数式编程 用常规编程语言中的函数指针.委托和Lambda表达式等概念来帮助理解(其实函数式编程就是Lambda演算延伸而来的编程范式). 函数式编程中函数可以被非常容易的定义和传递. Hask ...
- jenkins配置源码管理git
一.首先安装上来jenkins 二.下载安装jenkins的git插件:Git plugin 三.新建一个jenkins项目,选择构建一个自由风格的软件项目: 源码管理选择git,Repository ...
- linux查看发行版本
redhat系 cat /etc/redhat-release 其他 lsb_release -a
- Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍
网站日志分析项目案例(一)项目介绍:当前页面 网站日志分析项目案例(二)数据清洗:http://www.cnblogs.com/edisonchou/p/4458219.html 网站日志分析项目案例 ...