Objective-C之成魔之路【7-类、对象和方法】
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载。
假设文章对您有所帮助,欢迎给作者捐赠。支持郝萌主,捐赠数额任意,重在心意^_^
我要捐赠: 点击捐赠
Cocos2d-X源代码下载:点我传送
Objective-C作为一种面向对象的编程语言, 具有面向对象的基本特征,
即: 封装、 继承和多态。
主要介绍ObjectiveC中有关面向对象基本概念: 类、 对象、 方法和属性等。
也就是面向对象程序设计的一些关键概念,主要关注Objective-C定义类相关的语法。
OC面向对象方面的概念和其他语言差点儿相同。相比其他语言更接近C++。
对象就是一个物件。面向对象的程序设计能够看成一个物件和你想对它做的事情。
对象(名词)----实现(动词),先定义类(Class)。再定义方法(Method)。
C语言是典型的面向过程性语言。
在C语言中,一般是先考虑要实现什么,然后才关注对象,这差点儿总是与面向对象的思考过程相反。
实现(动词)----对象(名词)。先定义函数(Function),再定义模块(Module)。
类的独特存在就是一个实例,对实例运行的操作称为方法。
在某些情况下。方法能够应用于类的实例或类本身。
对象用法能够影响对象的状态。
关键概念:对象是类的独特表示,每一个对象都包括一些通常对该对象来说是私有的信息(数据)。方法提供訪问和改变这些数据的手段。
Objective-C採用特定的语法对类和实例应用方法:
[ ClassOrInstance method];
请求一个类或实例来运行某个操作时,就是向它发送一条消息,消息的接收者称为Receiver。所以。能够用第二种方式描写叙述:
[ receiver message];
Objective-C的Method操作运行。一种理解是发送消息,第二种是方法调用。
前一种更贴近OC的思想。
… …
}
… …
@end
@implementation Song
… …
@end
相同的。程序在逻辑上就分为以下3个部分:
@interface
@implementation
program
接口部分
@interface部分用于描写叙述类和类的方法;
@implementation部分用于描写叙述数据(类对象的实例变量存储的数据),并实如今接口中声明方法的实际代码;
主要定义了类名 、 继承的父类、 实现的协议、 成员变量和方法等信息。
举比例如以下:
NSString *title;
NSString *artist;
long int duration;
}
- (void)start;
- (void)stop;
- (void)seek:(long int)time;
@end
program部分的程序代码实现了程序的预期目的。
@interface部分一般格式例如以下:
@interface NewClassName: ParentClassName
propertyAndMethodDeclarations;
@end
依照约定,类名以大写字母开头。
实例变量、对象以及方法的名称。通常以小写字母开头。
确定名称时,要遵循找到能反映变量或对象使用意图的名称。
程序具有更强的自解释性(Self-explanatory)
制定名称的规则相当简单:名称必须以字母或下划线(_)开头,
之后能够使不论什么大写和小写字母、下划线或者数字的组合。
另外像$空格等都是非法,记住不能数字开头、不能使用保留字。
再次强调,Objective-C是大写和小写敏感的。
sum、Sum、SUM均表示不同的变量。
@implementation部分的一般格式例如以下:
@inplementation NewClassName
{
memberDeclarations;
}
methodDefinitions;
@end
须要注意的是:使用@synthesize指令能让编译器自己主动为你生成一些方法。
举比例如以下:
- (void)start {
//開始播放
}
- (void)stop {
//停止播放
}
- (void)seek:(long int)time {
//跳过时间
}
@end
接口和实现的要求:
接口文件包括类的公开信息,就可以以与这个类的使用者共享一些信息。
还有一方面,实现部分包括的是私有信息,即实例变量和代码。
类或实例方法,开头为负号(-)表示实例方法,正号(+)表示类方法。
返回类型放在开头的负号或正号之后的圆括号里。
有參数时,在方法名后加冒号(:),再加上參数类型和參数名。
详细的例如以下例所看到的:
-(int) currentAge;
-(void) print;
-(void) setNumber: (int) n;
方法类型 (返回类型) 方法名称 方法有參数 參数类型 參数名称
这叫做多重參数。
-(void) insertObjectAtIndex(id anObject, NSUInteger index)。
操作符号不是“. ” 而是“[…] ” , 例如以下所看到的:
[myObject insertObject: ojb1 atIndex:0];
即向myObject对象发出一个消息insertObject:atIndex: 。
而在实际使用时候这两种叫法都会用 , 这不是严格划分。
假设向某个类发送alloc消息。便获得该类的新实例。
这个alloc方法继承自父类。alloc方法保证对象的全部实例都变成初始状态。
当然想要适当的方法时,必须又一次初始化,调用init方法。
常常地情况是把alloc和init合在一起,或者直接使用new方法。
比如:
Fraction *myFraction; myFraction = [Fraction alloc];//类方法 myFraction = [myFraction init];//实例方法 Fraction *myFraction = [[Fraction alloc] init];//二合一 Fraction *myFraction = [Fraction new];//类方法,new包括alloc和init
记住,方法运行的上下文环境就是接收到消息的对象。
取值方法(get)和赋值方法统(set)称为訪问方法(accessor)。
这就是数据封装的原则。通过用法来訪问对“外界”隐藏的数据。
使用一个类的程序结束本章:
// // main.m // 3_2_class_object_method // // Created by haomengzhu on 14-11-01. // Copyright (c) 2014年 haomengzhu. All rights reserved. // #import <Foundation/Foundation.h> //-------- @interface section ---------- @interface Fraction: NSObject -(void) print; -(void) setNumerator: (int) n; -(void) setDenominator: (int) d; @end //-------- @implementation section ---------- @implementation Fraction { int numerator; int denominator; } -(void) print { NSLog(@"%i/%i", numerator, denominator); } -(void) setNumerator:(int)n { numerator = n; } -(void) setDenominator:(int)d { denominator = d; } @end //-------- program section ---------- int main(int argc, const char * argv[]) { @autoreleasepool { Fraction *myFraction; // new object myFraction = [Fraction alloc]; myFraction = [myFraction init]; // set [myFraction setNumerator: 1]; [myFraction setDenominator: 3]; // print all NSLog(@"Hello, World!"); [myFraction print]; } return 0; }
最后再来说说OC中的方法:
关于方法:
在编写新方法时,省略參数名不是一种好的编程风格,由于它是程序非常难读懂而且非常不直观,
特别是当使用的方法參数特别重要时。更是如此。
举比例如以下:
定义了Fraction类以及新方法:
-(void)setTo:(int)n over:(int)d;
注意以下的使用方式:
[aFraction set:1 :3]这是不好的
[aFraction set:1 over:3]这是好的
再加入新方法:
- (void)add:(Fraction *) f;
这条语句说明add:方法的參数是Fraction类对象的一个引用。
星号是必须的,所以声明(Fraction) f是不对的。
局部变量:
局部变量是主要的C数据类型,并没有默认的初始值。所以在使用前要先赋值。
局部对象变量默认初始化为nil。
和实例变量不同(它们在多次方法调用时保持自己的值),这些局部变量没有记忆力。
也就是说,当方法返回时。这些变量的值都消失了。
每次调用方法时。该方法中的局部变量都使用变量声明又一次初始化一次。
方法的參数:
方法的參数名也是局部变量。
运行方法时,通过方法传递的不论什么參数都被拷贝到局部变量中。
由于方法使用參数的副本。所以不能改变通过方法传递的原值。
这一点非常重要。
另外,假设參数是对象,可以更改当中的实例变量值。当你传递一个对象作为參数时,实际上是传递了一个数据存储位置的引用。正由于如此,你才可以改动这些数据。
statickeyword:
在变量声明前加上keywordstatic。能够使局部变量保留多次调用一个方法所得的值。
和其他基本数据类型的局部变量不同。
静态变量的初始值为0。
此外,它们仅仅在程序開始运行时初始化一次。而且在多次调用方法时保存这些数值。
记住:仅仅能在定义静态变量和局部变量的方法中訪问这些变量。