.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表示对象是当前对象的接收者。