1 类的声明及定义
一个类包含两部分:类的声明(@interface)和类的定义(@implement)。
类的声明为class.h,而定义为class.m,两个文件的名字相同,后缀名不同。
使用时,只需要import “class.h”即可。
#import <Foundation/Foundation.h>
@interface Number: NSObject
-(void) print();
-(void) setNum:(int) n;
-(int) num;
@end
这里是Number类的声明,继承自NSObject,有三个方法,print、setNum没有返回值,num返回int型值。
类的定义:
#import "Nuumber.h"
@implement Nuumber{
int num;
}
-(void)print {
NSlog(@"%i",num);
}
-(void)setNum:(int) n {
num = n;
}
-(int)num{
return num;
}
@end
注意:导入时用双引号,而不是<Foundation/Foundation.h>,双引号适用于自己的文件,而<>适用于系统文件。
调用时只需要引入Number.h文件即可。
#improt "Nuumber.h"
int main(int argc, char *argv[]){
@autoreleasepool{
Nuumber *number = [[Nuumber alloc] init];
[number setNum:2];
NSLog(@"result:%i",[number num]);
}
}
#improt "Nuumber.h"
int main(int argc, char *argv[]){
@autoreleasepool{
Nuumber *number = [[Nuumber alloc] init];
[number setNum:2];
NSLog(@"result:%i",[number num]);
}
}
2 生成存取方法
接口部分使用@property。使用后,实现部分就不需要再声明属性了,编译器会自动检查。
@interface Number : NSObject
@property num;
-(void) print();
-(void) setNum:(int) n;
-(int) num;
@end
实现部分使用@synthesize后,会自动生成存取方法:setNum和num;
@implement Nuumber
@synthesize num;
-(void)print {
NSlog(@"%i",num);
}
@end
@property ( copy, nonatomic ); copy属性会在setter方法内生成属性的副本,默认不会产生属性的副本,只是赋值(assign)。
nonatomic属性表示线程安全。
3 点运算符
访问Number类中的num属性可以使用 [number num];
也可以使用 number.num;
赋值使用 number.num = 1; 就等同于 [number setNum:1]
点运算符也可以用在自定义的方法上,如上有一个print方法,所以写作 number.print。需要注意的是点运算符一般用在属性上,用在方法代码风格不够清晰。
注意:使用@synthesize时,属性名不要为new alloc copy init。
4 多个参数
@interface DecimalNuumber : NSObject
@property integer , decimal;
-(void) setInteger:(int)a andDecimal:(int)b //-(void) setInteger:(int)a :(int)b;
@end
//调用
[number setInteger:1 andDecimal:2] //[number setInteger:1:2]
5 static关键字
在变量前加static关键字,为静态变量,可以让变量多次保留方法多次调用的值。
static int count = 0;
静态变量的初始化值为0。只在程序第一次运行时初始化,多次调用时保留值。
6 self关键字
self关键字用来指明对象是当前方法的接受者。
@implement Nuumber
@synthesize num;
-(void)print {
[self print1]
}
-(void)print1 {
NSlog(@"%i",num);
}
-(void)setNum:(int) n {
num = n + self.num;
}
-(int)num{
return num;
}
@end