ObjC学习5-变量和数据类型


1.控制变量作用域的指令

@protected 默认,可以被该类访问及任何子类方法调用

@private 可以在该类中访问,但不能不能在子类定义的方法直接访问

@public 可以被该类访问,也可以被其他类访问

@package 可以在实现该类的图像的任何地方访问这个实例变量


2.类的初始化 initWith

@interface Fraction:NSObject
int n ;
int d ;
-(Fraction *) initWith:(int) n:(int) d;
-(void) setTo:(int)n over:(int)d;
-(void) print;
@end


@implementation Fraction
-(Fraction *) initWith:(int) n :(int) d
{
self = [super init];
if(self)
[self setTo:n over:d];
return self;
}
-(void) setTo:(int)n1 over:(int)d1
{
n = n1;
d=d1;
}
-(void) print
{
NSLog(@"%i/%i",n,d);
}
@end

主程序:

Fraction * f = [[Fraction alloc] initWith:1:3];//初始化的同时赋值
[f print];
[f release];


这样就可以在初始化的同时为其变量赋值~

3.外部变量

int gGlobalVar = 5;

在程序开始处,在所有方法、类定义函数定义之外编写。

extern int gGlobalVar;
NSLog(@"%i",gGlobalVar);
gGlobalVar = 100;
NSLog(@"%i",gGlobalVar);

终端显示的结果:

5

100

外部变量可以被任何方法或函数访问和更改其变量的值,只是要访问时需在前面加上extern,这就告知系统,要访问的是其他文件中定义的全局变量

4.静态变量

只希望全局比昂两在特定的模块/文件是全局的,这时候我们可以把变量设为static的,变成静态变量,那么外部就访问不了了~

如:static gGlobalVar = 0;

那么在这个文件中,这条语句之后的方法函数都可以访问这个变量,但其他文件中的方法和函数则不行。

下面用一个例子来演示静态变量。

我们在Fraction方法中重载alloc的方法并让它使静态变量count增加

@interface Fraction:NSObject
int n ;
int d ;
-(Fraction *) initWith:(int) n:(int) d;
-(void) setTo:(int)n over:(int)d;
-(void) print;


+(Fraction *) allocF;
+(int) count;
@end


static gCounter;//全局的静态变量


@implementation Fraction
-(Fraction *) initWith:(int) n :(int) d
{
self = [super init];
if(self)
[self setTo:n over:d];
return self;
}
-(void) setTo:(int)n1 over:(int)d1
{
n = n1;
d=d1;
}
-(void) print
{
NSLog(@"%i/%i",n,d);
}
+(Fraction *) allocF
{
//重载alloc并不是很好的编程方式,因为这个方式处理内存的物理分配,不应涉及那个领域
extern int gCounter;
++gCounter;
return [Fraction alloc];
}
+(int) count
{
extern int gCounter;
return gCounter;
}
@end

主程序:

Fraction *a,*b,*c;
NSLog(@"Fraction allocated:%i",[Fraction count]);
a = [[Fraction allocF]init];
b = [[Fraction allocF]init];
c= [[Fraction allocF]init];
NSLog(@"Fraction allocated:%i",[Fraction count]);

[a release];
[b release];
[c release];
[pool drain];

结果为:


程序开始时gCounter值会自动设为0,然后每特殊初始化一次,gCounter值会增加一次,最终初始化三次所以gCounter的值被设置为3。

*静态变量有默认的初始值0


5.存储类型说明符

如:extern static 下面讨论更多的说明符

1)auto 自动局部变量-进入该快语句时自动为其分配存储空间~类似C#里面的using()吧

auto int index;//没有默认的初始值

2)const 类似C#的常量-恒定不变的值,count变量在自文档编制过程(self-documentation process)中很有帮助

const double pi = 3.141592654; //圆周率~~

3)volatile 和const相反,这个说明符告诉编译器,这是一个会改变的量…涉及到指针操作~囧。

*outPort ='0';

*outPort = 'N';

通常情况下第一行表示在outPort制定的内存地址存储字符0,

第二行则表示同一位置存储字符N。

一个智能的编译器会发现在也同意地址进行了连续两次赋值,那么它会把第一行的语句给过滤掉= =!

所以为避免这种情况的发生要用到volatile变量

volatile char *outPort;

4)枚举数据类型 OC编译器其实是把枚举变量当作整形来处理

enum flag {false,true};

要绳命一个枚举类型 仍需要用到enum关键字

enum flag endOfData;

endOfData=true;

if(endOfData==true)...


enum boolean{no=0,false=0,yes=1,true=1};

给enum boolean变量指配no和false时,就是向其赋值0,想yes true赋值1


enum direction{up,down,left= 10,right};

定义了包含up,down,left,right的枚举类型direction,

up,down会被默认赋值0,1,由于left显式地赋值为10,所以left=10,right递增赋值为11.


这里用一个小例子来巩固下枚举的学习:

enum month {january =1,february,march,april,may,june,july,august,september,october,november,december};
enum month amonth;
int days;

NSLog(@"Enter month number: ");
scanf("%i",&amonth);

switch (amonth){
case january:
case march:
case may:
case july:
case august:
case october:
case december:
days=31;
break;
case april:
case june:
case september:
case november:
days = 30;
break;
case february:
days = 28;
break;
default:
NSLog(@"bad month number");
days =0;
break;
}
if(days!=0){
NSLog(@"Number of days is %i",days);}
if(amonth == february)
{
NSLog(@"...or 29 if it 's a leap year");
}

结果:

再次运行



5)typedef 一种超能力!能为一个类型指派一个名称!nice啊~

typedef int Counter;

Counter j,n;//Counter类型就是int类型= =!

做个小例子~~~

typedef NSString *String;
String a ,b ,c;
a=@"nice!";
NSLog(@"String a is %@",a);

结果:


这真的太神奇了~声明其实相当于NSString *a,*b,*c;


例如:Foundation框架在它的一个头文件中使用typedef对NSComparisonResult进行了如下定义:

enum _NSComparisonReult

{

NSOrderedAscending = -1,NSOrderedSame,NSOrderedDescending

};

typedef NSInteger NSComparisonResult;// ~~~

-(NSComparisonResult) compare:(NSString *) string;//Foundation下的compare方法声明如下

If([userName compare:savedName]==NSOrdereSame)//实际上是检测返回的结果是否为0~~~

{

...

}

6)类型转换

ave = (float)total/n;//使用类型转换运算符显式地转换


7)符号扩展 这个概念还并不是很理解= =~

两种声明形式

unsigned char//不进行符号扩展

signed char//进行符号扩展


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值