Time: 2014-10-25 Tag: 初学IOS Objective-C基础学习

关于Objective-C

Objective-C,通常写作ObjC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言。它主要使用于Mac OS X和GNUstep这两个使用OpenStep标准的系统,而在NeXTSTEP和OpenStep中它更是基本语言。Objective-C可以在gcc运作的系统上编写和编译,因为gcc含Objective-C的编译器。1980年代初布莱德·确斯(Brad Cox)在其公司Stepstone发明Objective-C。他对软件设计和编程里的真实可用度问题十分关心。Objective-C最主要的描述是他1986年出版的Object Oriented Programming: An Evolutionary Approach. Addison Wesley. ISBN 0-201-54834-8.

Objective-C


一 背景

一直对移动开发和手机游戏开发感兴趣,但是一直处于打酱油的状态,最近也在学习cocos2d-x,然后顺便学习下怎么将程序移植到ios平台上,但是因为对ios开发的环境不熟悉,移植最后以失败而告终,于是准备在业余时间投入到学习ios开发和cocos2d-x中。
一开始学习ios开发时,直接去学习可视化界面的开发,发现有些困难,因为连基本的Objective-C语法都不清楚,所以先大概看了下Objective-C语法。
Objective-C是Mac软件开发领域最主要的开发语言,Objective-C是ANSI版本C语言的超集,支持C基本语法。类的设计和语法主要是基于Smalltalk,最早的面向对象语言之一。
Objective-C中头文件以.h结尾,源文件以.m或.mm结尾,通常是以.m结尾。当你在源文件中需要包含头文件时,你可以使用标准的#include选项,但是Objective-C中提供了更好的方法,使用#import选项。#include选项和#import选项相同,知识#import选项能确保头文件只被包含一次,所以在Objective-C中我们最好使用#import选项。

二 基础语法
1 > 方法调用
[object  method] (不带参数的方法调用 object是对象 method是对象的方法)
[object  method : input] (带参数的方法调用 input是传入参数)
output= [object  methodWithOutput] (对象的方法调用可以有返回值 output就是返回值)

2 > 字符串变量
作为C的超集,Objective-C支持C语言中字符串的相关约定:单个字符被单引号包括,字符串被双引号包括。然而在Objective-C中通常不使用C语言风格的字符串,因为Objective-C中提供一个更好的处理字符串的NSString类。NSString包含你所以预期的优点,包括:保存任意长度的字符串,支持printf风格的格式化工具...
在Objective-C中NSString使用得相当频繁,Objective-C提供了一个助记符可以方便的从常量创建NSString对象。要使用这个助记符,只需要在普通的双引号字符串前面添加一个@符号。
NSString *myString = @”hahaya”;


3 > id类型

id类型就意味着变量可以指向任意类型的变量,比如下面的myObject对象,可以指向任意类型的变量,id类型是弱类型。
id myObject = [NSString string];
注意 :Objective-C中所有对象都是指针类型的。id类型已经预先被定义成一个指针类型了,所以不需要再加星号。

4 > 嵌套方法调用
在C/C++等语言中嵌套方法、嵌套函数的用法如下,function2的返回值传入function1当输入参数
function1( function2() );
在Objective-C中,嵌套方法、函数、消息的用法如下,[prefs fromant]的返回值传入[NSString stringWithFormant : input]中当输入参数,和C/C++等语言中类似
[NSString stringWithFormant : [prefs fromant]]
注意:应当尽量避免一行代码中嵌套调用超过两个,如果这样会造成代码的可读性下降

5 > 类
和其他面向对象的语言一样,Objective-C也是使用类来封装数据的,Objective-C的类规格说明包括两部分:接口和实现。接口部分包含类的声明和实例变量的定义,以及类的相关方法。而实现部分包括了类方法的实际代码。下面是一个类声明示例
1.jpg
(1)类声明总是由@interface编译选项开始,由@end编译选项结束
(2)类名之后,冒号分割的是父类的名称
(3)类的实例(即成员)变量声明在大括号包括的代码块内
(4)实例变量块后面就是类方法的声明列表(当然也可能有属性)
注意: 虽然前面的类只声明了方法,但是类可以声明属性。

6 > 方法
Objective-C中的类可以声明两种类型的方法:实例方法和类方法。调用实例方法前,必须先创建类的一个实例,然后通过类的实例来调用实例方法。而类方法则是属于整个类,不需要创建实例,通过类来调用。(类似于C++中的成员方法和静态成员方法的概念)
前面已经讲解过无输入参数和单输入参数的方法,那么下面就重点说下多输入参数的方法。方法声明包括:方法类型标示符、返回值、一个或多个方法名、参数类型和参数名,具体见下图说明
2.jpg
(1)声明由“-”开始,这是一个方法类型标示符,表明该方法是一个实例方法
(2)方法实际的名字是所有方法名的级联,包括冒号(insertObject : atIndex :)
在头文件中我们可以按如下的样子来定义多输入参数的方法
- (BOOL) writeToFile : (NSString*)path atomically : (BOOL)useAuxiliaryFile;
其中writeToFile和atomically是方法名,path和useAuxiliaryFile是输入参数
竟然已经知道了如何声明、定义一个多输入参数的方法,那么我们在使用的时候该如何调用呢?调用方法如下
BOOL result = [myData writeToFile : @”/tmp/log.text” : atomically : NO];
注意:无论什么时候见到方括号,都是向一个对象或者一个类发送了消息

7 > 属性
属性是用来代替声明存取方法(get和set方法)的快捷方式。属性不会在类中创建一个新的实例变量(即成员变量),属性仅仅是定义方法访问类中实例变量(即成员变量)的速记方式而已。暴露实例变量(即成员变量)的类可以使用属性记号来代替get和set方法。
因为属性可以让类不写实例变量(即成员变量)的get和set方法,所以属性可以让你少写很多代码。属性避免了暴露类中实例变量(即成员变量)的get和set方法,取而代之的是用属性声明指定你希望的行为,然后在声明期间合成基于属性声明的get和set方法。
属性声明放在类接口声明(即方法声明)处。基本的属性声明使用@property编译选项,然后后面紧跟类型信息和属性名字。当然你还可以定制编译选项来对属性进行配置,这些编译选项决定了存取方法的行为。请看下面的例子
@property BOOL flag;
@property (readonly) UIView *rootView; (只能读,仅创建get方法)
使用属性的另一个好处就是要在代码中访问它们的地方使用点语法,请看下面的例子
myObject.flag = YES;
CGRect viewFrame = myObject.rootView.frame;