self指针
slef指针是用来指向对象或者类本身的。当我们在类方法中使用self那么它指向的是那个类本身,在对象方法中使用self指向的是调用该方法的对象本身。self的存在可以让我们在设计类的时候让方法更加的通用。
self 指针的列子:
# import <Foundation/Foundation.h>
@interface Person : NSObject
{
char *_name;
}
-(void) setName: (char*)name;
-(char *)name;
@end
@implementation Person
-(void) setName: (char*)name
{
self->_name = name; //这里的self指的是对象本身
}
-(char *) name
{
return self->_name;
}
+(void) run
{
Person *p = [self new]; // 这里的self指的是类本身
[p setName:"tom"];
NSLog(@"%s is runing",[p name]);
}
@end
点语法
点表达式是用来方便我们访问和设置对象的属性的。点表达式看起来与C语言的结构体访问相似。如果点表达式出现在等号的左边则表示是设置对象该属性(即是调用setter方法),若出现在等号的右侧则是访问该属性(调用getter方法)。
构造方法
构造方法是用来初始化对象的成员变量的。在一个类中可以有多个构造方法,我们可以根据需求去选择性的调用,在OC中凡是以init开头的方法都是构造方法。OC不会自动调用构造方法,需要我们在创建对象的时候自己手动去调用,并且一般我们也只会调用一次构造方法。在写构造方法的时候要注意的是为了安全,必须首先调用父类的构造方法。
构造方法包括两个部分,一个是首先对调用父类的构造,然后才是子类部分的实现。
例子如下:
-(Dog *)init
{
if(self = [super init]) //父类的构造方法调用,当失败时会返回nil指针
{
_w = 5;
_age = 0;
}
return self;
}
类别是用来扩充类的方法的,我们可以在不改变原来的类的情况下增加类的新的方法,也可以重写类原来的方法。而且在方法调用的过程中,若在分类里和类里面有相同的方法会优先调用分类的方法。注意的是分类不可以增加实例变量,在使用分类的时候也需要讲其头文件导入。
分类的例子:
#import <Foundation/Foundation.h>
@interface NSString (Print)
-(void)print;
@end
#import "NSString+Print.h"
@implementation NSString (Print)
-(void)print{
NSLog(@"%@",self);
}
@end
OC中几个特别的方法
- (NSString *)description 描述对象方法
+(void)load 类加载时会调用 父类会先调用 在本身类 最后是分类
+(void)initialize 类被使用的时候调用