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";

浙公网安备 33010602011771号