创建: 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: ]; //分配内存与初始化

● 子类不可以重写这个

- (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 ;
}
+ (int)getTwo {
return ;
}
@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环境
   
   
   
   
   
   
   
   
   
   
 新的运行时系统 
   
   
   
   
   
   
   
   
   
   

Objective-C NSObject与运行时系统的更多相关文章

  1. Objective-O Runtime 运行时初体验

    Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一 ...

  2. iOS学习之Objective-C 2.0 运行时系统编程

    0 导言 本主主要内容包括: 1.概述2.参考3.运行时系统的版本和平台4.和运行时系统的交互5.消息6.动态方法解析7.消息转发8.类型编码9.属性声明 1 概述 Objective-C语言将决定尽 ...

  3. [Xcode 实际操作]八、网络与多线程-(18)PerformSelector消息处理方法:由运行时系统,负责去调用对象的指定方法

    目录:[Swift]Xcode实际操作 本文将演示PerformSelector消息处理方法. 在项目文件夹上点击鼠标右键弹出文件菜单. [New File]->[Swift File]-> ...

  4. Java 内存管理、JVM 工作原理与 Java 运行时系统

    Java 虚拟机规范中说明:所有的对象实例(all class instances)以及数组都要在堆上分配: the heap is the runtime data area from which ...

  5. oc的运行时系统

    Objective-C is a class-based object system. Each object is an instance of some class; the object's i ...

  6. cefSharp 设置运行时系统语言

    在使用用CefSharp使用过程中,系统用了很多第三方控件.这些控件很多能够根据浏览器设置的语言来进行控件展示对应语言. 在cefSharp可以设置系统语言,代码如下: CefSharp.Settin ...

  7. iOS开发——高级特性&Runtime运行时特性详解

    Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 ...

  8. Objective-C Runtime 运行时之一:类与对象

    Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一 ...

  9. Objective-C Runtime 运行时之三:方法与消息

    基础数据类型 SEL SEL又叫选择器,是表示一个方法的selector的指针,其定义如下: typedef struct objc_selector *SEL; objc_selector结构体的详 ...

随机推荐

  1. Huawei-R&S-网络工程师实验笔记20190615-IP基础(AR201上配置IP)

    >Huawei-R&S-网络工程师实验笔记20190615-IP基础(AR201上配置IP) >>实验开始,先上拓扑图参考: >>>一般正常配置IP操作如下 ...

  2. MTK平台如何定位显示花屏和界面错乱等绘制异常的问题?

    [DESCRIPTION] 在测试手机各项功能过程中,经常会遇到概率性复现“屏幕画花了,界面画错乱了等绘制异常问题”,而且概率还非常小: 这类问题请不要直接提交eService,而是先请测试人员及工程 ...

  3. CentOS 6.4 下用ntfs-3g挂载Windows NTFS分区

    默认情况下,CentOS 6.4不支持Widows NTFS硬盘分区读写,要想把NTFS格式的磁盘挂载到CentOS 6.4下面 需要安装第三方的插件ntfs-3g,这里我们采用编译安装插件. 1.安 ...

  4. Extjs6(六)——增删查改之查询

    本文主要实现的效果是:点击查询按钮,根据form中的条件,在Grid中显示对应的数据(如果form为空,显示全部数据) 一.静态页面 1.查询按钮 { text:'查询', handler: 'onS ...

  5. [bzoj4131]并行博弈_博弈论

    并行博弈 bzoj-4131 题目大意:题目链接. 注释:略. 想法:我们发现无论如何操作都会使得$(1,1)$发生改变. 所以单个$ACG$的胜利条件就是$(1,1)$是否为黑色. 如果为黑色那么可 ...

  6. JAVA配置--JDK环境变量配置

    环境变量是整台电脑的全局变量,(这台电脑上)任何程序都可以读取这个变量. 如果您安装好jdk,但环境变量配置让你感到有一点模糊的话,那么请您看一下这篇,希望对您有帮助 根据打开电脑的属性(R),出现 ...

  7. python操作mysql方法和常见问题

    http://www.cnblogs.com/ma6174/archive/2013/02/21/2920126.html 安装mysql模块 sudo easy_install mysql-pyth ...

  8. 003 rip

    r0#config t Enter configuration commands, one per line.  End with CNTL/Z. r0(config)#router rip r0(c ...

  9. windows 7 文件加密设置

    方法/步骤1 加密文件 1 右击需加密的文件,选择“属性”命令. 2 在属性对话框的“常规‘选项卡中单击”高级“按钮. 3 在弹出的对话框中选中”加密内容以便保护数据“复选框,单击”确定“按钮. 4 ...

  10. 走进Struts2(一) — Struts2的执行流程及其工作原理

     Struts2是一套很优秀的Web应用框架,实现优雅.功能强大.使用简洁.能够说是Struts2是一款很成熟的MVC架构. 在我们学习Struts2时,最好是先学习它的执行流程.核心概念.从中得到启 ...