1.Objective-C基础学习

来源:互联网 发布:美津浓和亚瑟士 知乎 编辑:程序博客网 时间:2024/06/05 16:32
hello world!
    #import <Foundation/Foundation.h>    int main(int argc, const char * argv[])    {        @autoreleasepool {            NSLog(@"hello world!");        }        return 0;    }

解释:
#import <Foundation/Foundation.h>  
表示将系统文件Foundation/Foundation.h 导入或包含到改程序中,类似C中的 include 
导入该文件是因为它包含的其他类和函数的有关信息将在程序后面的部分用到

int main(int agc, const char * argvp[]) {}
main 主函数,和C中一样

@autoreleasepool {}
自动释放池,其机制是:它使得应用在创建新对象时,系统能够有效的管理应用所使用的内存。

NSLog(@"hello world!");
调用NSLog函数,并传递参数 @"hello world!" 
其中的@表示"hello world!"是一个NSString字符串对象
NSLog相当于C中的printf ,但NSLog不用加“\n”换行符
int value1 = 2;
NSLog(@"value1:%i",value1);
输出为 value1:2
其中%i 表示将要显示一个整数。。类似于C中的%d

类、对象、方法
对象就是一个物件
就比如,汽车,汽车就是一个类,而你的汽车就是汽车的一个实例,是一个对象。
这个实例/对象就是从该类中创建的。   所以每生产一辆汽车就是创建了一个汽车类的新实例/对象。
类的独特存在就是一个实例。对实例执行的操作成为方法。在某些情况下方法可以应用于类的实例或者类的本身。
对象使用方法可以影响对象的状态,
OC中采用特定的语法对类和实例应用方法:
[ClallOrInstance method];
ClallOrInstance:类的名称或者该类的实例/对象名称
method:将要执行的方法
左方括号后面要紧跟类的名称或者该类的实例/对象名称,它后面可以有一个或者多个空格,空格后面是将要执行的方法
也可以理解为请求一个类或者实例来执行某个操作时,就是在向他发送一条消息,消息的接收者成为接收者,所以可以表示为:
[receiver message];
receiver: 接收者,类的名称或者该类的实例/对象名称
message:发送的消息,将要执行的方法

有些方法可能需要参数:
[ClallOrInstance method: part];

有些方法可能有返回值:
int ret;
ret = [ClallOrInstance method];

一个简单的类
编写一个可以处理分数的类
#import <Foundation/Foundation.h>

//---@interface 部分----   为类声明实例变量,用于描述类和类的方法
@interface Fraction: NSObject     //Fraction:新类的名字      NSObject:父类的名字-(void) print;         /*开头的负号(-)用来通知编译器该方法是一个实例方法         也可以写成+ ,表示该方法为类方法,类方法是对类本身执行某些操作的方法,比如创建类的新实例       */-(void) setNumerator: (int) n;   //前面的void 表示返回值为空    : (int) n 表示实例方法有一个int型的参数-(void) setDenominator: (int) d;@end

//------ @implemention 部分----添加实例变量,描述数据(类对象的实例变量存储的数据),并实现接口中声明的方法的实际代码
    @implemention 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 部分---
    <span style="color:#000000;">int main(int agc, const char * argvp[])    {        @autoreleasepool {            Fraction *myFraction;    //定义一个Fraction类型的对象            //创建一个分数实例            myFraction = [Fraction alloc];   //为 对象/实例 分配内存存储空间,alloc方法继承Fraction 的父类,            myFraction = [myFraction init];                    /*init 方法初始化对象 此句等同于:myFraction = [ [Fraction alloc] init];                   还可以写成 Fraction *myFraction =  [ [Fraction alloc] init];                     简化来写可以是:Fraction *myFraction = [Fraction new];                  */             //设置分数为1/3            [myFraction setNumerator: 1];   //向myFraction 对象发送消息setNumerator: 并提供一个值为1 的参数。            [myFraction setDenominator: 3];            //使用打印方法显示分数            NSLog(@"The value of myFraction is:");            [myFraction print];        }        return 0;    }</span>

Fraction *myFraction;
myFraction 前面的 * 表明myFraction 是 Fraction 对象的一个引用(或者指针),
myFraction 存储了一个引用,其实是内存地址,表明对象数据在内存中的位置。
进行alloc 和 init 后,内存状态如下:

其实对象中存储的数据比这要多一些,但目前不用在意。

[myFraction setNumerator: 1];
setNumerator方法设置对象中实例变量的值,这种方法通常成为设值方法,
而用于检索实例变量值的方法叫做取值方法。
设值方法和取值方法通常成为访问器(accessor)方法

0 0