NSObject

初始化类

1. + (void)initialize;
在程序主动调用类的第一个方法前,initialize会被调用;如果类的某些方法是被系统调用的,不算是程序主动调用;如果类有继承,
父类的initialize会先于子类被调用;如果子类没有实现initialize或者显示调用[super initialize],父类的initialize就有可能被多次调用;
可以在父类中重写initialize,来避免父类的initialize被多次调用;

+ (void)initialize {
  if (self == [ClassName self]) {
    // ... do the initialization ...
  }
}

 2. + (void)load;

当类或类别被系统运行时runtime加载时,如果该类或类别实现了load,load会被调用;

如果想在类加载完成后,执行一些代码,就实现load;

 

创建,复制,释放对象

1.+ (instancetype)alloc;

alloc会生成一个新的对象,但是对象中的实例变量都未初始化,地址指向0;

一般需要重写init来初始化类的实例变量;

TheClass *newObject = [[TheClass alloc] init]; --创建对象

2. - (instancetype)init;

在对象被分配内存后,初始化对象

3. + (instancetype)new;

系统会调用alloc,init

4.- (id)copy;  + (id)copyWithZone:(struct _NSZone *)zone;

如果自定义类实现NSCoding协议,重写了copyWithZone,那么在用copy方法复制对象时,系统会调用copyWithZone;

最终生成的对象应该为不可变对象;

5.- (id)mutableCopy; + (id)mutableCopyWithZone:(struct _NSZone *)zone;

如果自定义类实现NSMutableCoding协议,重写了mutableCopyWithZone,那么在调用mutableCopy方法复制对象时,系统会调用mutableCopyWithZone

最终生成的对象应该为可变对象;

6.- (void)dealloc;

可以重写该方法来释放创建的对象,dealloc方法在引用计数为0时会被系统自动调用;不要再程序显示调用dealloc;

如果没有使用ARC,重写dealloc的方法最后要调用父类的dealloc,如果是用ARC,重写dealloc方法最后不要调用父类的dealloc;

 

检测类

1.  + (Class)class; 返回class对象

2. + (Class)superclass; 返回父类的class对象;

3. + (BOOL)isSubclassOfClass:(Class)aClass; 检测类是否是aClass类的子类或一样的类

4.+ (BOOL)instancesRespondToSelector:(SEL)aSelector;

判断类的实例是否可以调用某方法;

selector用于编译方法名

SEL aSelector = @selector(methodName);
SEL aSelector = NSSelectorFromString(@"methodName");

5. + (BOOL)conformsToProtocol:(Protocol *)protocol;

判断类是否实现了某协议;

BOOL canJoin = [MyClass conformsToProtocol:@protocol(Joining)];

 方法执行

1.- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;

当delay延时到时候后,将方法执行的任务放进当前线程的runloop队列中,当前线程会依次执行runloop队列中的任务;

2. - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;

当前线程thr1将方法执行的任务交给线程thr来执行;如果wait=Y,当前线程thr1阻塞,直到方法aSelector执行完;如果wait=N,线程thr1不阻塞,

立刻返回;

 

KVO键值监听

#import <Foundation/Foundation.h>
//被监听的类
@interface Target : NSObject

@property (strong,nonatomic) NSString* name;
@property (strong,nonatomic) NSObject* obj;

-(id)initWithObserver:(NSObject*)obj;
@end



@implementation Target

@synthesize name; //设置该属性自动触发监听

-(id)initWithObserver:(NSObject*)obj
{
    self.obj=obj; //添加监听
    [self addObserver:_obj forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
    return [self init];
}


- (void)dealloc
{
    [self removeObserver:_obj forKeyPath:@"name" context:nil];
}

@end

 

#import <Foundation/Foundation.h>
//监听的类
@interface Observer : NSObject

@end

#import "Observer.h"

@implementation Observer

//需要重写该方法,监听到键改变后触发调用
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey, id> *)change context:(void *)context
{
    NSLog(@"%@",keyPath);
}

@end

 

//调用 
  Observer* obs=[[Observer alloc] init];
    Target* tag=[[Target alloc] initWithObserver:obs];
//    [tag setName:@"xiaoming"];
    tag.name=@"xiaoming";

 

posted @ 2017-09-26 00:17  zxuan  阅读(113)  评论(0)    收藏  举报