objective-c 语法快速过(1)

有必定 c++或者 java 基础,过一遍 oc 语法便可,都是相通的,我的认为难点是 oc 的内存管理,虽然有了 ARC,可是也须要学习下,由于有旧软件的维护。java

创建在C语言的基础上,增长了一层小范围的面向对象的语法(保留了面向对象最精华的部分,oc的内容没有java多,而java的内容没有c++多,c++的内容最为繁杂),OC彻底兼容C语言,c和oc能够混编。能够在OC代码中混入C语言代码(前提是oc源文件扩展名是.m),甚至是C++代码(不是全部的源文件都能包含c++代码,只有源文件扩展名是.mm的源文件能够包含c++代码)。c++

可使用OC开发Mac OS X平台和iOS平台的应用程序objective-c

关键字编程

基本上全部关键字都是以@开头,一些常见的关键字框架

@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语言中的字符串,其中,@和字符串必须紧挨着。ui

注释spa

注释的语法和C 同样。设计

nil

OC 中的 nil 至关于 c 和 c++的NULL 

OC程序的开发过程

编辑,编译,连接(把全部的相互关联的.o文件合并在一块儿,加上函数库),运行。

和c相似,先编写.m文件(文件名能够是中文),而后编译器编译,连接,运行。

 

NSLog与printf的区别

一、NSLog接收OC字符串做为参数,printf接收C语言字符串做为参数

二、NSLog输出后会自动换行,printf输出后不会自动换行

三、使用NSLog须要#import <Foundation/Foundation.h>,里面有NSLog函数的声明。不须要刻意记忆,想不起来,就编译,出错就会提示缺乏什么。

四、能够只包含框架的主头文件,效果等价包含了这个框架里的全部的头文件。头文件在Xcode里面,路径很深,很差找。使用printf须要#include <stdio.h>

#import的做用(预处理)

一、跟#include同样,用来拷贝某个文件的内容

二、能够自动防止文件内容被拷贝屡次,也就是头文件中不用和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 = 200;

内存分析(对象在内存中有成员)

[Car new]每次都会建立出新的对象,而且返回对象的地址,那么就应该用一个指针变量保存对象的地址

Car *c = [Car new];//用一个指针变量c指向内存中的Car对象     

设置车子对象的属性,跟用指向结构体的指针访问结构体属性同样,用->

c->wheels = 3;

c->speed = 300;

对象在内存里的变化和状态图

oc 类成员的访问属性:

oc类属性,默认是@protected,本类内部和继承的类能访问,而外部没法访问,须要手动设置为public。

@pubic

有一个典型的错误

oc千万不能想固然的和c++,java混淆,不用在类实现里再添加花括号了,直接写方法的实现便可。

 和c++的不一样,oc的类占据一分内存空间

在第一次使用类的时候,类被加载到内存里,即在建立对象以前,先给类分配内存空间。

一、存放类的内存只被加载一次(第一次使用对象的时候,加载对象属于的类)便可,且里面只存放方法的列表。

二、内存里每一个类的对象的存储空间内部,默认都有一个指针叫isa指针,每一个对象都有,做用是:指向这个对象所对应的类(存放类的内存块,帮助找到对象所属的类),因此全部的对象都共用一份方法,因此类只被加载一次便可。成员变量每一个对象都有本身的那一分内存,可是方法就共用一分内存

三、调用方法的过程:

[person1 walk]; 

执行:

给指针person1指向的对象发送一条walk消息,去调用那个对象的walk方法,而后对象会顺着isa指针找到对应的类,去类里找方法,找到walk方法,就前往对应的代码去执行,就在walk方法里访问当前对象的成员变量age和weight(由于成员变量,每一个对象都有本身的一份

再次强调:将对象赋给id类型变量不会有问题。

注:不管在哪里,对象老是携带它的isa的保护成员(一个指针,能够用来肯定对象所属的类) ,因此即便将它存储在id类型的通用对象变量中,也老是能够肯定它的类 。

面向对象封装的好处

  • 更加接近人类的思考方式
  • 只须要关注对象,不须要关注步骤 
  • 可是注意:oc的对象不会自动去回收,一旦建立,一直存在内存里,除非手动释放,或者程序执行完毕。因此,函数建立的对象不会消失。可是没有指向它的指针存在了。
  • 注意,oc 里,方法和函数是有本质的区别的,不要混淆!
相关文章
相关标签/搜索