首页 > 代码库 > OC类相关知识
OC类相关知识
我们新建一个student类
1、声明文件-student.h
#import <Foundation/Foundation.h>
@interface student : NSObject{
int _age;
}
- (int) getAge;
- (void)setAge:(int)age;
@end
@interface代表声明一个类,:NSObject代表继承自NSObject,成员变量应当定义在大
括号中,一般在成员变量前面加下划线_,默认作用域是@protected,我们在@interface和@end里面定义成员变量和方法。在定义方法的参数中一个冒号对应一个参数,类型都要用括号括住。在中间声明的所有方法都是公共的方法。
如果在set方法中有多个参数,例如我们在添加一个int _score成员变量,然后在set方法中赋值,我们可以这样表示:(void)setAge:(int)age andScore:(int)score;
冒号是方法名的一部分,例如:(void)setAge:(int)age andScore:(int)score;它的方法名是:setAge:andScore:。
2、实现文件-student.m
#import "student.h"
@implementation student
-(int)getAge{
NSLog(@"invoke get function");
return _age;
}
-(void)setAge:(int)age{
_age=age;
NSLog(@"invoke set function");
}
@end
@implementation代表来实现一个类
3、类的调用-main.m
#import <Foundation/Foundation.h>
#import "student.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
student *stu=[[student alloc] init];
[stu setAge:20];
int age=[stu getAge];
[stu release];
NSLog(@"age is %i",age);
}
return 0;
}
输出结果:
invoke set function
invoke get function
age is 20
在main方法中,我们首先创建一个对象,创建对象分为2步:首先调用一个静态方法alloc来分配内存,然后再调用一个动态方法init进行初始化。为了安全地初始化对象,应该把内存分配方法和初始化方法结合起来使用,像上面的程序一样。OC中方法调用用的是中括号[]。当不再使用对象时,我们可以调用release方法释放对象。
默认的构造方法,也就是init方法,它是无参数的。我们可以自定义一个带参数的构造方法。
-(id)initWithHeight:(int)height{
if(self=[super init])
{
_height=height;
}
return self;
}
在OC中,初始化方法的实现需要遵守比其他种类方法更多的约束和规则:
1、自定义初始化方法的命名一般应以“init”开头;
2、初始化方法的返回值类型必须是id;
3、在自定义初始化方法的实现中,必须有对本类的指定初始化方法的引用。
一般get方法直接以成员变量的名字来命名,所以在上面的程序中,我们将(int)getAge改为(int)age,然后我们可以用stu.age=20来代替[stu setAge:20],用int age=stu.age来代替[stu age],输出的结果是一样的。也就是.号在赋值语句的左边相当于set方法,.号在右边相当于get方法。
-代表动态方法,+代表静态方法。”+”方法通过类名直接访问,和java程序一样,例如:[student 静态方法]。”-”方法必须通过实例化对象后才能访问,例如:[stu getAge]。
NSLog可以输出任何OC对象,NSLog(@”%@”,stu);它会输出<类名:对象的内存地址>。
NSLog函数一旦发现用%@输出某个OC对象时,就会调用这个对象的description方法(这个方法返回值是NSString类型,是OC中的字符串类型),并且将description方法返回的字符串代替%@的位置进行输出。
我们可以重写description方法,但是不要在其中同时使用%@和self,这样会死循环的。
- (NSString *)description {
return [NSString stringWithFormat:@"age=%i", _age];
}
OC类相关知识