您的位置:首页 > 移动开发 > Objective-C

Objective-c 学习笔记(一)

2016-05-10 00:04 435 查看
.c           C 语言源文件
.cc         .cpp C++语言源文件
.h          头文件
.m         Objective-C源文件
.mm     Object-c++源文件
.pl           perl源文件
.o             Object编译后的文件 

选择 Use Automatic Reference Counting。
自动释放内容  ARC,一种编译期技术

如果不用xcodel,可以使用terminal手工执行编译等动作。 clang 编译命令  LLVM
Objective-C区分大小写字母
#import <Foundation/Foundation.h>  让编译期找到并处理名为Foundation.h的文件。
#import表示将该文件的信息导入或包含到程序中,使用其他类或函数
#import <Foundation/Foundation.h>
int main(int argc, const char*argv[]){  //main入口,返回int,参数是命令行输入参数,先别管
    @autoreleasepool{  //花括号之间的语句会在自动释放池里面执行
        NSLog (@"hahahah");  //NSLog函数,@在一对双引号字符串前,称为常量NSString对象
        //如果没有这个@,就是在编写常量C类型的字符串,有了这个符号,就是编写NSString字符串对象。
    }
    return 0;  //XCode的输出窗口会显示  program exited with status value:0
}

NSLog(@"The sum of 50 and 25 is %i", sum);

类方法调用的方法
[Car new]
[myCar drive]
[yourCar setSpeed: 55] 速度设置为55

定义一个新类:三部分
@interface: 描述类和类的方法
@implementation:描述数据,类对象的实例存储的数据
@program

@interface Fraction: NSObject   //NSObject是父类,在NSObject.h中定义,导入Foundation.h会自动包括这个类
-(void) print;   //负号,表示他是一个实例方法;还可以使正号,表示类方法。类方法对类本身执行操作,如创建类的新实例
-(void) setNumber: (int) n; //返回值类型 比如-(int)
-(void) setDenominator: (int) d; //参数和方法名之间,用冒号
@end

@implementation Fraction{
    int numerator;
    int denominator;
}
-(void) print{...}
-(void) setNumerator: (int) n { numerator = n;}
@end

program部分
int main(int argc, char * argv[]){
    @autoreleasepool{
        Fraction *myFraction;  //一个用于存储Fraction的对象

        myFraction = [Fraction alloc];   //alloc是allocate的缩写,要求为新分数分配内存存储空间;该方法继承自父类; 执行alloc,获得该类新的实例
        myFraction = [myFraction init]; //alloc之后所有的实例变量都变成了初始状态,但并不代表适当的初始化了。
        //注意,前面调alloc的是大写的Fraction,这儿调init的,是小写的myFraction,表示这是一个实例方法。
        这两行在Objective-c中很常见,经常组合在一起?myFraction = [[Fraction alloc] init];
        最终的简写形式经常是: Fraction *myFraction = [[Fraction alloc] init];

        [myFraction  setNumerator:1];
        [myFraction  setDenominator:3];

        NSLog (@"The value of myFraction is :");
        [myFraction print];
}
也可以在interface部分为类声明实例变量。
每一部分通常在单独的文件中。

以前的代码需要给对象发送release消息,通知系统释放对象。XCode4.2以后,可以依靠系统来释放内存、ARC

myFraction前的星号(*)表明myFraction是Fraction对象的引用(或指针)。变量myFraction实际并不存储Fraction的数据,只是存储了一个引用(内存地址)。

可以用new方法将alloc和init的操作结合起来。因此程序行 Fraction *myFraction = [Fraction new];可用于创建和初始化新的Fraction。
------------------------------------------------------------------------------
objective-c 提供了4种基本数据类型:int 、float、 double、 char,@并且放在引号中的字符是NSString对象
限定词:long、long long、short、unsigned、signed  //对应于%li
id类型:可以存储任何类型的对象。一般是对象类型。id类型是objective-c中十分重要的特性,是多态和动态绑定的基础。

类型转换运算符常用于将一般id类型的对象转换成特定类的对象。如:
id myNumber;
Fraction *myFraction;
...
myFraction = (Fraction *)myNumber;

NAN表示不是一个数字。这个字符被定义在系统头文件math.h中,会被自动引入程序。

switch(expression){
    case value1:
        aaa
        break;
    case value2:
        ...
        break;
}

boolean:非零意味着满足、零意味着不满足

通常把类的声明interface放在.h文件中,把类的定义implementation部分放在.m文件中。
#import "Fraction.h"把接口文件导入实现文件中,注意,这儿是双引号,不是<>
<Foundation/Foundation.h>。<>表示是系统文件,""表示是本地文件。

Objective-2.0开始,可自动生成设值方法和取值方法。 
可以在接口中使用@property指令标识属性。这些属性的命名与实例变量相同。
@property int numberator, denominator;  就不用再定义numerator/setNumerator方法了。

如果使用了@property指令,就不需要在implementation中实现声明相应的实例变量。

可以使用点点运算符访问属性
[myfraction setNumerator:1]; 等价于 myFraction.numerator = 1;

具有多个参数的方法
可以用一个方法同时设置多个属性。
addEntryWithName: andEmail: 表示接收两个参数的方法,这两个参数可能是姓名和电子邮件方法。
[myFraction setNumerator: 1 andDenominator: 3]
使用时 [aFraction setTo: 100 over: 200];
定义时  -(void)  setTo: (int) n over: (int) d;
实现中fraction.m中:
-(void) setTo: (int) n over: (int) d(
    numerator = n;
    denominator = d;
)

不带参数名的方法
创建方法时,参数名实际上是可选的。
- (int) set: (int) n: (int) d;
这儿的第二个参数没有命名。这个方法名为set::,两个冒号表示这个方法仍然有两个参数。
要调用set::方法,可以使用冒号作为参数分隔符,[aFraction set: 1 : 3];  省略参数并不是好习惯。

-(void) add: (Fraction *) f;   参数f是Fraction类的一个引用,星号是必须的。
[aFraction add: bFraction]

局部变量
方法内部的变量,默认初始化为nil,方法返回时,这些变量的值小时。

static关键字
在变量声明前加上关键字static,可以使局部变量保留多次调用一个方法所得的值
自动初始化为0.只在程序开始执行时初始化一次,并且在多次调用方法时保存这些值。

-(int) showpage{
    static int pageCount = 0;
    ...
    ++pageCount;
    ...
    return pageCount;
}

静态变量可以定义在方法里面,也可以定义在方法外面。

关键字self表示对象是当前对象的接收者。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: