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

来源:互联网 发布:网络视频服务器参数 编辑:程序博客网 时间:2024/06/07 18:04


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//进行符号扩展


原创粉丝点击