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

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

我要捐赠: 点击捐赠

Cocos2d-X源代码下载:点我传送


构造方法

出于初始化类中的成员变量的须要。 能够提供一个方法用于此目的, 
这种方法就叫构造方法或构造方法(Constructor)。 
与C++和Java不同。 Objective-C命名是没有限制的, 而且有返回值本身类型指针。

以音乐类举例:
Song.h文件

@interface Song : NSObject {
NSString *title;
NSString *artist;
long int duration;
}
//操作方法
- (void)start;
- (void)stop;
- (void)seek:(long int)time;
//訪问成员变量方法
@property(nonatomic,retain) NSString *title;
@property(nonatomic,retain) NSString *artist;
@property(readwrite) long int duration;
//构造方法
-(Song*) initWithTitle: (NSString *) newTitle
andArtist: (NSString *) newArtist
andDuration:( long int ) newDuration;
@end
在Song类的定义中加入了一个方法。 它一般用 init开头命名, 
它的返回值非常特殊, 是返回值本身类型指针。 而且有返回值本身类型指针。

实现代码例如以下:

@implementation Song
@synthesize title;
@synthesize artist;
@synthesize duration;
//构造方法
-(Song*) initWithTitle: (NSString *) newTitle
andArtist: (NSString *) newArtist
andDuration:(long int) newDuration {
self = [super init];
if ( self ) {
self.title = newTitle;
self.artist = newArtist;
self.duration = newDuration;
}
return self;
}
... ...
@end
代码说明:
1、头文件引用规则
导入的文件要用一对引號引起来,而不是<Foundation/Foundation.h>中的“<”和">"字符。

双引號适用于本地文件(你自己创建的文件),而不是系统文件,这样就通知编译器在哪里可以找到指定的文件。

2、构造方法的实现代码差点儿就是模式代码, 基本上都是例如以下写法: 
-(id)init
{
self = [super init];
if (self) {
//初始化代码
}
return self;
}
当中使用 [super init] 来调用父类默认构造方法。

对象的初始化的常见的编程习惯是类中全部的初始化方法都以init开头。

假设希望在类对象初始化时做一些事情。能够通过覆写init方法达到这个目的。

这种方法返回的实例对象指派给还有一新个关键词: self。

self非常像 C++ 和 Java 的 this。 

3、还有if ( self ) 跟 ( self != nil ) 一样, 是为了确定调用父类构造方法成功返回了一个新对象。 
当初始化变量以后。 用返回self 的方式来获得自己的地址。 

4、父类默认构造方法 -(id) init。 
技术上来说, Objective-C中的构造方法就是一个 "init" 开头的方法。 
而不像 C++ 与Java 有特殊的结构。

5、必须将父类init方法的运行结果赋值给self,

由于初始化过程改变了对象在内存中的位置(意味着引用将要改变)。

假设父类的初始化过程成功,返回的值是非空的。通过if语句能够验证,
凝视说明能够在这个代码块的位置放入自己定义的初始化代码。
通常能够在这个位置创建并初始化实例变量。

注意,

init被定义为返回id类型,这是编写可能会被继承的类init方法的一般规则。

程序開始运行时。它向全部的类发送initialize调用方法。

假设存在一个类及相关的子类,则父类首先得到这条消息。

该消息仅仅向每一个类发送一次。而且向该类发送其他不论什么消息之前,保证向其发送初始化消息。

实例成员变量作用域限定符

在接口中声明的实例变量能够通过子类进行继承。

能够把以下指令放在实例变量之前。以便更精确地控制其作用域:

即便从封装的角度出发, 实例成员变量应该定义为@private, 
但作为一种面向对象的语言, Objective-C支持@public、 @private和@protected作用域限定。 
假设一个实例变量没有不论什么的作用域限定的话, 那么缺省就是@protected。

•@public作用域限定的实例变量,能够被本类、其它类或者模块中定义的方法直接訪问,即可在不论什么情况下訪问。 

•@private作用域限定的实例变量。仅仅能在这个类里面才可以訪问;
在实现部分定义的实例变量默认属于这样的作用域。

•@protected作用域限定的实例变量。 能够在这个类里面和这个类的派生子类里面能够訪问这个变量,
在类外的訪问是不推荐的,
但也能够訪问。

在接口部分定义的实例变量默认是这样的作用域。

•@package,对于64位映像。能够在实现该类的映像中的不论什么地方訪问这个实例变量。

@public指令使得其它方法或函数能够通过使用指针运算符(->)訪问实例变量。
但实例变量声明为public并非良好的编程习惯,
由于这违背了数据封装的思想(即一个类须要隐藏它的实例变量)。

以一个简单的样例说明作用域:
訪问定义例如以下:
#import <Foundation/NSObject.h>

@interface Access: NSObject {
@public
int publicVar;
@private
int privateVar;
@protected
int protectedVar;
} @end

调用的main函数例如以下:

#import <Foundation/Foundation.h>
#import "Access.h" int main (int argc, const char * argv[]) { Access *a = [[Access alloc] init]; a->publicVar = 5;
NSLog(@"public var: %i\n", a->publicVar); a->protectedVar = 6;
NSLog(@"protectedVar var: %i\n", a->protectedVar); //不能编译
//a->privateVar = 10;
//NSLog(@"private var: %i\n", a->privateVar); return 0;
}

注意:

@public、 @private和@protected作用域限定仅仅能修饰的实例成员变量,
不能修饰类变量, 更不能修饰方法。

什么是类变量和类方法

再以一个简单的样例说明下:

ClassA.h文件

#import <Foundation/NSObject.h>

static int count;

@interface ClassA: NSObject {
int aaa; }
+(int) initCount;
+(void) initialize;
@end

ClassA.m文件

#import "ClassA.h"

@implementation ClassA

-(id) init {
self = [super init];
count++;
return self;
} +(int) initCount {
return count;
} +(void) initialize {
count = 0;
}
@end
代码说明:
init方法是默认构造方法, 
在这个构造方法中累计类变量count, 
在实例方法中能够訪问类变量的, 可是类方法不能訪问实例变量。 
initCount 方法是一个普通的类方法, 用于返回类变量count。 
initialize方法是很特殊的类方法,它是在类第一次訪问时候被自己主动调用 , 
因此它一般用来初始化类变量的。 
类似于C#中的静态构造方法。


调用的main函数
#import <Foundation/Foundation.h>
#import "ClassA.h" int main( int argc, const char *argv[] ) {
ClassA *c1 = [[ClassA alloc] init];
ClassA *c2 = [[ClassA alloc] init]; // print count
NSLog(@"ClassA count: %i", [ClassA initCount] ); ClassA *c3 = [[ClassA alloc] init];
NSLog(@"ClassA count: %i", [ClassA initCount] ); [c1 release];
[c2 release];
[c3 release]; return 0;
}

代码说明:

在第一次实例化ClassA时候会调用两个方法:

initialize类方法和实例构造方法init,

然后再次实例化ClassA时候仅仅是调用实例构造方法init。
而没有调用 initialize类方法。 

这样类变量count被一直累加。 它隶属类。

因此c1 实例能够訪问, c2和c3都能够訪问。

关于属性、存储方法和实例变量:

编码规范(Xcode4已经採用的)眼下的趋势是使用下划线(_)作为实例变量名的起始字符。

@synthesize window = _window;

表明合成(synthesize)属性window的取值方法和设置方法,

并将属性与实例变量_window(实例变量并没有显性声明)关联起来。

这对差别属性和实例变量的使用是有帮助的。

[window makeKeyAndVisible]; //错误

[_window makeKeyAndVisible];//正确

[self.window makeKeyAndVisible];//正确

全局变量:

在程序的開始处(全部的方法、类定义)编写一下语句:

int gMoveNumber = 0;

那么这个模块中的不论什么位置都能够引用这个变量的值。

这样的情况下,我们说gMoveNumber被定义为全局变量。

依照惯例。用小写的g作为全局变量的首字母。

外部变量是可被其它不论什么方法或函数訪问和更改其值的变量。

在须要訪问外部变量的模块中,变量声明和普通方式一样。仅仅是须要在声明前加上keywordextern。

使用外部变量时。必须遵循以下这条重要的原则:变量必须定义在源文件里的某个位置。

即在全部的方法和函数之外声明变量,而且前面不加keywordextern。如:int gMoveNumber;

确定外部变量的另外一种方式是在全部的函数之外声明变量。

在声明前面加上keywordextern,同一时候显式地为变量指派初始值。

记住。声明不会引起分配变量的内存空间,而定义会引起变量内存空间分配。

处理外部变量时,变量能够在很多地方声明为extern,可是仅仅能定义一次。

注意,假设变量定义在包括訪问该变量的文件里,那么不须要单独进行extern声明。

静态变量:

在方法之外定义的变量不仅是全局变量,并且是外部变量。

假设希望定义全局变量且仅仅在特定模块(文件)中是全局的,就能够使用static来修饰。

注意。重载alloc并非好的编程实践,由于这种方法处理内存的物理分配。

枚举数据类型:

枚举数据类型的定义以keywordenum开头。之后是枚举数据类型的名称,然后是标识符序列(包括在一对花括号内),它们定义了能够给该类型指派的所以的同意值。

在代码中定义的枚举类型的作用域限于块的内部。

另外,在程序的開始及全部块之外定义的枚举数据类型对于该文件是全局的。

定义枚举数据类型时,必须确保枚举标识符与定义在同样作用域之内的变量名和其它标识符不同。

Objective-C之成魔之路【9-类构造方法和成员变量作用域、以及变量】的更多相关文章

  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之成魔之路【13-预处理程序】

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

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

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

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

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

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

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

  9. Objective-C之成魔之路【7-类、对象和方法】

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

随机推荐

  1. 3xian退役贴【深思。】

    这是原文: 最后一天,漫天飘起了雪花,假装欢送我离去. 这次WF之战不太顺利,早期的C题大概花了1秒钟构思,然而由于输出格式多了一个空格直到两个半小时才逃脱Wrong Answer的纠缠.还好lynn ...

  2. 链栈之C++实现

    链栈是借用单链表实现的栈.其不同于顺序栈之处在于: 1.链栈的空间是程序运行期间根据需要动态分配的,机器内存是它的上限.而顺序栈则是 静态分配内存的. 2.链栈动态分配内存的特性使得它一般无需考虑栈溢 ...

  3. SRM 624 Building Heights DivI 解读

    几乎相同的一标题.欲了解更多请参阅:http://community.topcoder.com/stat?c=problem_statement&pm=13211&rd=15857 思 ...

  4. 打造你自己ajax上传图片

    今天,我们需要的图片上传插件,但是,互联网不提供符合他们的需要和易于使用的.所以我写了自己. 方法1,只使用jquery代码,.代码例如以下 <p> <label>上传图片&l ...

  5. ThinkPHP 3.2 开发过程

    原文:ThinkPHP 3.2 开发过程 设置所有项目的公共配置Application\Common\Conf\config.php,SAE模式下配置文件为config_sae.php 配置默认的模块 ...

  6. Cocos2d-x 游戏存档

    游戏存档功能能够保存游戏中数据.让玩家游戏能够延续. 单机游戏更为重要.而CCUserDefault能够作轻量级数据库使用,用来存储数据,支持数据类型bool,int, float, double, ...

  7. Python学习入门基础教程(learning Python)--5.3 Python写文件基础

    前边我们学习了一下Python下如何读取一个文件的基本操作,学会了read和readline两个函数,本节我们学习一下Python下写文件的基本操作方法. 这里仍然是举例来说明如何写文件.例子的功能是 ...

  8. RGB转为Lab空间

    虽然若干年前就看过了关于色彩空间的介绍,但是直到今天才自己动手写代码做这件事情.虽然网络上已经有很多现成的例子,但是一则仅仅适用于浮点型的数据,另一方面,在实现上也有一些尚可优化之处. 色彩模型除了最 ...

  9. 字符串string和内存流MemoryStream及比特数组byte[]互转

    原文:字符串string和内存流MemoryStream及比特数组byte[]互转   字符串string和内存流MemoryStream及比特数组byte[]互转比较 定义string变量为str, ...

  10. .Net——使用.net内置处理程序处理自己定义节点Demo

    在.net中.由于对不同的节点,都相应着类去对它进行处理,.net里面为了方便.已经内置了一些类供我们使用.使我们在读取配置文件时.不必自己去定义类去处理自己定义的自己定义节点. 以下我们写了这样一个 ...