Objective-C之成魔之路【9-类构造方法和成员变量作用域、以及变量】
郝萌主倾心贡献,尊重作者的劳动成果。请勿转载。
假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^
我要捐赠: 点击捐赠
Cocos2d-X源代码下载:点我传送
出于初始化类中的成员变量的须要。 能够提供一个方法用于此目的,
以音乐类举例:
@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
实现代码例如以下:
@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
双引號适用于本地文件(你自己创建的文件),而不是系统文件,这样就通知编译器在哪里可以找到指定的文件。
-(id)init
{
self = [super init];
if (self) {
//初始化代码
}
return self;
}
对象的初始化的常见的编程习惯是类中全部的初始化方法都以init开头。
假设希望在类对象初始化时做一些事情。能够通过覆写init方法达到这个目的。
3、还有if ( self ) 跟 ( self != nil ) 一样, 是为了确定调用父类构造方法成功返回了一个新对象。
4、父类默认构造方法 -(id) init。
5、必须将父类init方法的运行结果赋值给self,
注意,
init被定义为返回id类型,这是编写可能会被继承的类init方法的一般规则。
程序開始运行时。它向全部的类发送initialize调用方法。
假设存在一个类及相关的子类,则父类首先得到这条消息。
该消息仅仅向每一个类发送一次。而且向该类发送其他不论什么消息之前,保证向其发送初始化消息。
在接口中声明的实例变量能够通过子类进行继承。
能够把以下指令放在实例变量之前。以便更精确地控制其作用域:
•@private作用域限定的实例变量。仅仅能在这个类里面才可以訪问;
•@protected作用域限定的实例变量。 能够在这个类里面和这个类的派生子类里面能够訪问这个变量,
但也能够訪问。
在接口部分定义的实例变量默认是这样的作用域。
#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;
}
注意:
不能修饰类变量, 更不能修饰方法。
再以一个简单的样例说明下:
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
#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-类构造方法和成员变量作用域、以及变量】的更多相关文章
- Objective-C之成魔之路【0-序章】
郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠,支持郝萌主,捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 C语言首创 ...
- Objective-C之成魔之路【5-选择结构】
郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 Objec ...
- 《带你装B,带你飞》pytest成魔之路4 - fixture 之大解剖
1. 简介 fixture是pytest的一个闪光点,pytest要精通怎么能不学习fixture呢?跟着我一起深入学习fixture吧.其实unittest和nose都支持fixture,但是pyt ...
- Objective-C之成魔之路【16-使用文件】
郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠.支持郝萌主,捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 语言的设计 ...
- Objective-C之成魔之路【13-预处理程序】
郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠.支持郝萌主,捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 预处理提供 ...
- Objective-C之成魔之路【19-归档】
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠.支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 在Obje ...
- Objective-C之成魔之路【10-继承性】
郝萌主倾心贡献.尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主.捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 继承性是面 ...
- Objective-C之成魔之路【8-訪问成员变量和属性】
郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 訪问成员变 ...
- Objective-C之成魔之路【7-类、对象和方法】
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠.支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 Objec ...
随机推荐
- Hibernate4读取Clob数据
package cn.framework.dao.impl; import java.io.BufferedReader; import java.io.IOException; import jav ...
- C语言 realloc为什么要有返回值,realloc返回值具体解释/(解决随意长度字符串输入问题)。
在C语言操作中会用到大量的内存操作,当中非经常常使用的一个是realloc(). 由字面意思能够知道,该函数的作用是用于又一次分配内存. 使用方式例如以下: NewPtr=(数据类型*)realloc ...
- hdu 4708 Rotation Lock Puzzle 2013年ICPC热身赛A题 旋转矩阵
题意:给出一个n*n的矩阵,旋转每一圈数字,求出对角线可能的最大值,以及转到最大时的最小距离. 只要分析每一层就可以了,本来想用地址传递二维数组,发现行不通,改了一下就行了. 这里有个坑,比如: 1 ...
- Nubia Z5S 基于官方H207/4.4内核的Mokee4.4.4 RC3.2 (2014.7.31修复呼吸灯(能亮依旧不能呼吸))
特别感谢 yun3195 和 轻描淡写Yhw 帮忙測试 转帖请务必注明本链接地址: http://blog.csdn.net/syhost/article/details/36444259 此ROM ...
- 使用BBED恢复数据文件头
转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/31018075 @@@@@@@利用BBED模拟损坏5文件1号块(文件头) BBED> ...
- Activity组件的生命周期
一.Activiy组件的三个状态: 1.前台状态(active) : 在屏幕的最上层,页面获得焦点,可以响应用户的操作2.可视状态(paused) : 不能与用户交互,但是还存在于可视区域内,它依然存 ...
- codeforces 598D Igor In the Museum
题目链接:http://codeforces.com/problemset/problem/598/D 题目分类:dfs 题目分析:处理的时候一次处理一片而不是一个,不然会超时 代码: #includ ...
- ThinkPHP使用分组详细介绍(十七)
原文:ThinkPHP使用分组详细介绍(十七) 使用分组(模块分组) *就是将多个项目合并到一个项目/应用去(就是Home.Admin) ---分组不分组看自己的建立项目习惯,个人习惯用根目录配置生成 ...
- [C++]new和delete
Date:2014-1-5 Summary: C++中的动态内存创建与释放(这里就只记录C++中的new和delete了,其他的C风格操作就略过了) 单独记录new和delete的原因是为了学习时候关 ...
- 小侃#pragma
#pragma是一个编译器指令. ================================================================ #pragma comment(li ...