Objective-C NSObject与运行时系统

创建: 2018/01/26

完成: 2018/02/02 

遗留: TODO

 NSObject
 运行时系统

 程序运行时候起作用的系统?

 NSObject是运行时系统的接口(API) 

 属性

 只有一个isa,决定实例与类的关系,不可以自己变更

@interface NSObject <NSObject> {
    Class isa  OBJC_ISA_AVAILABILITY;
}

可以获取当前实例变量所属的类

 类与实例

 

获取当前类

 - (Class) class;

 + (Class) class;

注: 类对象作为参数时候必须用类方法(# TODO: check [p181])

 获取自己(实例)

 - (id) self;

可以用作什么都不做的方法来用

 判断实例所属的类

 

- (BOOL) isMemberOfClass: (Class) aclass;

 

判断实例是不是指定的类的实例
- (BOOL) isKindOfClass: (Class) aclass;

判断实例是不是指定的类或其子类的实例

 类的指定用class方法

[NSObject class];

 

 获取父类

 - (Class) superclass;

 + (Class) superclass;

   

 

 实例的生成与释放

 

+ (id) alloc;

 生成指定类的实例

 ● 只是分配内存, 要和构造函数一起(init或init开头的)

[[Sample alloc] initWithLength: 1]; //分配内存与初始化

 

 ● 子类不可以重写这个

 - (void) dealloc;

 手动计数下有效,ARC下无效

 释放实例

 ● 作为release的结果被呼出

 ● 子类重写这个的话,不可以手动呼出

 - (oneway void) release;

 手动计数下有效,ARC下无效

 受体的计数-1,到0呼出dealloc

 

# TODO: Supply [oneway 修饰符 s19多线程内 p480]

 - (id) retain;

 手动计数下有效,ARC下无效

 计数+1, 返回受体自己

 - (id) autorealse;

 手动计数下有效,ARC下无效

 把受体放入自动释放池, 返回自己

 - (NSUInteger) retainCount; 

 手动计数下有效,ARC下无效

 返回受体的参照计数, 用来debug
 - (void) finalize;

 垃圾收集机制下释放受体前呼出

# TODO: Supply [垃圾收集 s6 p138]

   
   
   
 初始化

 

- (void) init;

 初始化alloc生成的实例

 子类处可以重载,也可以新建init开头的初始化方法

+ (void) initialize;

 初始化类对象

 在类收到对象时候自动进行一次,不可以自己呼出

- (id) new;  alloc + init

 

 对象的比较

  

- (BOOL) isEqual: (id) anObject;

 参数与受体是非相同 YES/NO

 (指针指向相同) 

- (NSInteger) hash;

 在集合内部等, 返回系统内部的哈希值

 

 描述类

 

+ (NSString *) description;

 返回表示受体的类的字符串

 一般是类名

- (NSString *) description;

 返回表示受体内容的字符串

 一般是类名与id值

 子类里可以自定义

 

   
 信息传递机制(其他语言的函数)
 SEL类型

 信息选择器(方法名)也是一种数据类型, SEL

 无效的SEL表现为, NULL或者(SEL)0

 用SEL呼出信息

 

- (id) performSelector: (SEL) aSelector;

传递aSelector信息

Sample *obj = [[Sample alloc] init];
[obj performSelector: @selector(method)];
//相当于 [obj method]

 

- (id) performSelector: (SEL) aSelector withObject: (id) anObject;

 传递aSelector信息, anObject作为参数

 

 信息探索途径

 判断是否可以回应信息

 收到信息后吗,先找自身,没有再往上找,到NSObject还没有就会报错

 

- (BOOL) respondsToSelector: (SEL) aSelector;

 受体的类及其父类有没有处理信息的方法

 判断类的实例能不能处理,也就是实例方法

+ (BOOL) instancesRespondToSelector: (SEL) aSelector;  判断类及父类能不能处理,包括类方法和实例方法
@interface S8_A : NSObject {    
}
- (int)getOne;
+ (int)getTwo;
@end

@implementation S8_A
- (int)getOne {
    return 1;
}
+ (int)getTwo {
    return 2;
}
@end
printf("-能不能回应getONE: %s\n", [temp respondsToSelector:@selector(getOne)] ? "OK":"NO");
printf("+instance能不能回应getONE: %s\n", [S8_A instanceMethodForSelector:@selector(getOne)] ? "OK":"NO");
    
printf("-能不能回应getTwo: %s\n", [temp respondsToSelector:@selector(getTwo)] ? "OK":"NO");
printf("+instance能不能回应getTwo: %s\n", [S8_A instanceMethodForSelector:@selector(getTwo)] ? "OK":"NO");
/*
-----------------------------------------
                  S8
-----------------------------------------
-能不能回应getONE: OK
+instance能不能回应getONE: OK
-能不能回应getTwo: NO
+instance能不能回应getTwo: OK
*/

 

 获取函数指针

 尽量不用 # TODO: Supply [p187]

 对self的代入  改变了受体,所以除了init外不用

 target action

 目标-动作模式

action method

application框架(Mac OS)

- (void)XXXXX:(id)sender;

UIKit(iOS)

- (void)XXXXX;

- (void)XXXXX:(id)sender;

- (void)XXXXX:(id)sender forEvent:(UIEvent *)event;

 Xcode里事件方法和

 控件的写法

 事件:
- (IBAction) XXXXX:(id)sender; // IBAction是macro, 表示void

 outlet: 参照GUI的可读写声明属性叫做outlet

IBOutlet NSbutton *theButton; // IBOutlet也是macro,实际为空白
//同时声明多个
IBOutletCollection(NSButton) NSArray *buttons;// IBOutletCollection(NSButton)编译后也是空白
//声明属性
@property(weak) IBOutlet NSButton *okButton;//都有weak

 

 

# TODO: Supply [p198~207]

 
   
   
 Objective-C与Cocoa环境
   
   
   
   
   
   
   
   
   
   
 新的运行时系统 
   
   
   
   
   
   
   
   
   
   

 

posted @ 2018-01-26 04:02  懒虫哥哥  阅读(106)  评论(0编辑  收藏  举报