郝萌主倾心贡献,尊重作者的劳动成果,请勿转载。

假设文章对您有所帮助,欢迎给作者捐赠。支持郝萌主,捐赠数额任意,重在心意^_^

我要捐赠: 点击捐赠

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的思想。

Objective-C的类声明和实现包含两个部分:接口部分和实现部分。
@interface Song: NSObject {

… …

}

… …

@end

@implementation Song

… …

@end

相同的。程序在逻辑上就分为以下3个部分:

@interface

@implementation

program

接口部分

@interface部分用于描写叙述类和类的方法;

@implementation部分用于描写叙述数据(类对象的实例变量存储的数据),并实如今接口中声明方法的实际代码;

主要定义了类名 、 继承的父类、 实现的协议、 成员变量和方法等信息。

举比例如以下:

一首好听的音乐,以下的代码是Song类的接口部分声明。
@interface Song : NSObject {

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均表示不同的变量。

实现部分
使用keyword@implementation, 主要实现了在接口部分定义的方法等信息。

@implementation部分的一般格式例如以下:

@inplementation NewClassName

{

memberDeclarations;

}

methodDefinitions;

@end

须要注意的是:使用@synthesize指令能让编译器自己主动为你生成一些方法。

举比例如以下:

以下的代码是Song类的实现部分声明。

@implementation Song

- (void)start {

//開始播放

}

- (void)stop {

//停止播放

}

- (void)seek:(long int)time {

//跳过时间

}

@end

接口和实现的要求:

接口文件包括类的公开信息,就可以以与这个类的使用者共享一些信息。

还有一方面,实现部分包括的是私有信息,即实例变量和代码。


方法和消息

类或实例方法,开头为负号(-)表示实例方法,正号(+)表示类方法。

返回类型放在开头的负号或正号之后的圆括号里。

有參数时,在方法名后加冒号(:),再加上參数类型和參数名。

详细的例如以下例所看到的:

-(int) currentAge;

-(void) print;

-(void) setNumber: (int) n;

方法类型 (返回类型) 方法名称 方法有參数 參数类型 參数名称

可见。Objective-C中方法定义很古怪, 它遵循了SmallTalk语法风格。 它将一个方法名字分成几个部分。

如图所看到的:

再次解释说明:
定义了两个參数的方法, 
第一个參数是anObject, 參数类型是id类型, 
第二个參数是index。 參数类型是NSUInteger,

这叫做多重參数。 
它的返回类型是void。 
方法签名是insertObject:atIndex: 。 
方法类型标识符中都“-” 代表方法是实例方法, “+” 代表方法是类方法,
 关于实例方法和类方法我们将在后面内容中讨论。

假设上面的方法变成C或C++形式。 则是以下的样子的: 

-(void) insertObjectAtIndex(id anObject, NSUInteger index)。

消息发送
对于方法的调用通常也不称之为调用 。 而是称为发出消息。

操作符号不是“. ” 而是“[…] ” , 例如以下所看到的: 

[myObject insertObject: ojb1 atIndex:0];

即向myObject对象发出一个消息insertObject:atIndex: 。

而在实际使用时候这两种叫法都会用 , 这不是严格划分。


alloc是allocate的缩写。

假设向某个类发送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。

此外,它们仅仅在程序開始运行时初始化一次。而且在多次调用方法时保存这些数值。

记住:仅仅能在定义静态变量和局部变量的方法中訪问这些变量。

Objective-C之成魔之路【7-类、对象和方法】的更多相关文章

  1. Objective-C之成魔之路【0-序章】

    郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠,支持郝萌主,捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 C语言首创 ...

  2. Objective-C之成魔之路【5-选择结构】

    郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 Objec ...

  3. 《带你装B,带你飞》pytest成魔之路4 - fixture 之大解剖

    1. 简介 fixture是pytest的一个闪光点,pytest要精通怎么能不学习fixture呢?跟着我一起深入学习fixture吧.其实unittest和nose都支持fixture,但是pyt ...

  4. Objective-C之成魔之路【16-使用文件】

    郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠.支持郝萌主,捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 语言的设计 ...

  5. Objective-C之成魔之路【9-类构造方法和成员变量作用域、以及变量】

    郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 构造方法 ...

  6. Objective-C之成魔之路【13-预处理程序】

    郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠.支持郝萌主,捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 预处理提供 ...

  7. Objective-C之成魔之路【19-归档】

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠.支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 在Obje ...

  8. Objective-C之成魔之路【10-继承性】

    郝萌主倾心贡献.尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主.捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 继承性是面 ...

  9. Objective-C之成魔之路【8-訪问成员变量和属性】

    郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 訪问成员变 ...

随机推荐

  1. 7z.exe 命令行压缩文件排除文件(exclude filenames) 手记

    命令行使用格式:Usage: 7z <command> [<switches>...] <archive_name> [<file_names>...] ...

  2. TF实战:(Mask R-CNN原理介绍与代码实现)-Chapter-8

    二值掩膜输出依据种类预测分支(Faster R-CNN部分)预测结果:当前RoI的物体种类为i第i个二值掩膜输出就是该RoI的损失Lmask 对于预测的二值掩膜输出,我们对每个像素点应用sigmoid ...

  3. discuz x3论坛搬家换虚拟主机完美使用教程 亲测可行 附操作步骤

    第一步:备份网站数据进入后台—站长—数据库—备份,数据备份类型选择“Discuz!和 UCenter数据”,备份成功以后,数据自动保存在data文件夹下. 第二步:网站文件下载 把整个网站文件打包(虚 ...

  4. .net core Elasticsearch 查询更新

    记录一下: 数据结构如下: public class ESUserTransaction { public long AccountId { get; set; } public string Var ...

  5. ls 命令还能这么玩?看一下这 20 个实用范例

    Linux中一个基本命令是ls.没有这个命令,我们会在浏览目录条目时会遇到困难.这个命令必须被每个学习Linux的人知道. ls是什么 ls命令用于列出文件和目录.默认上,他会列出当前目录的内容.带上 ...

  6. 虚拟机找不到本机vmnet0,vmnet8,无法连接xshell,解决方案

    首先出现这个问题肯定是第一次下载虚拟机把之前的注册表覆盖了,网卡找不到,首先卸载VMware 并且将C\ProgramData下的VMware文件夹删除掉 ,下载cceaner,点击注册表清除干净,再 ...

  7. Javascript 原型链与constructor

    Javascript中的constructor与prototype 在学习javascript面向对象编程的过程中, constructor和prototype一直让我觉得理解不透,慢慢的学习过程中记 ...

  8. Reading Lists

    * Non-academic 1. Slowing Down to the Speed of Life, by Richard Carlson and Joseph Bailey.2. Your Mo ...

  9. BZOJ 3993 Luogu P3324 [SDOI2015]星际战争 (最大流、二分答案)

    字符串终于告一段落了! 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3993 (luogu) https://www.l ...

  10. codeforces 371D

    #include<stdio.h> #define N 210000 struct node { int x,next; __int64 count,vec; }pre[N]; int n ...