OC 运行时系统

Google OC 方法签名 的时候突然发现了这个
感觉不错 :
http://www.imooc.com/wenda/detail/244088
http://my.oschina.net/charsunny/blog/200971
OC这个语言尽可能的将一些决定从编译和链接时推迟到运行时。它会尽可能的动态的处理事情。这意味这个语言
不仅需要一个编译器,还需要一个运行时系统去执行编译过的代码。这个运行时系统扮演着对于OC这个语言操作系统的的角色,使得这个语言得以运行。

遗留版本和现在版本

  • 在遗留版本的运行时系统,如果你改变一个类的实例变量,你必须重新编译它的所有子类。
  • 在现在版本的运行时系统,若果你改变一个类的实例变量,你无需重新编译他的所有子类。

选择器: 选择器是一种文本字符串,用于之美那个调用对象或类中的发方法。在OC中消息的选择器直接与一个或多个类/实例方法声明对应。

SEL 类型: SEL是一种搞特殊的OC数据类型,是用于在编译源代码时醍醐俺的唯一标识符。具有相同选择器值得方法都拥有相同的SEL标识符。OC运行时,系统会确保每个选择器 标识符的唯一性。 OC 运行时系统含有许多将SEL变量用作参数的动态方法。

方法签名: method signature 定义了方法输入参数的数据类型和方法的返回值。

消息运行时, 编译器会将对象消息转换为声明红哪有方法签名的C函数调用语句。

#import <Foundation/Foundation.h>

@interface Calculator : NSObject

-(NSNumber *) SumAddend1:(NSNumber *) adder1 addend2:(NSNumber *) adder2;
-(NSNumber *) SumAddend1:(NSNumber *) adder1 :(NSNumber *) adder2;
// 注意哦 , 这不是方法重载, 方法重载 是指函数名相同, 但是 这两个一个函数名是 SumAddend1 : addend2: ,  一个是: SumAddend1 :: 
@end
#import "Calculator.h"

@iplementation Calculator

-(NSNumber *) SumAddend1:(NSNumber *) adder1 addend2:(NSNumber *) adder2{
  NSLog(@" Invoking method on %@ object with selector %@", [self className], NSStringFromSelector(_cmd));
  return [NSNumber numberWithInteger:([adder1 integerValue]) + ([adder2 integerValue])];
}

-(NSNumber *) SumAddend1:(NSNumber *) adder1 :(NSNumber *) adder2{
  NSLog(@" Invoking method on %@ object with selector %@", [self className], NSStringFromSelector(_cmd));
  return [NSNumber numberWithInteger:([adder1 integerValue]) + ([adder2 integerValue])];
}

//_cmd , self 都是隐式参数
// 官方文档是这个样子写滴: The _cmd variable is a hidden argument passed to every method that is the current selector
#import <Foundation/Foundation.h>
#import "Calculator.h"

int main(int argc, const char * argv[]){
  @autoreleasepool
  {
      Calculator *calc = [[alculator alloc] init];
      NSNumber *addend1 = [NSNumber numberWithInteger : 25];
      NSNumber *addend2 = [NSNumber numberWithInteger : 10];
      NSNumber *addend3 = [NSNumber numberWithInteger : 15];
NSLog(@"%@", [calc sumAddend1 : addend1 addend2 : addend2];
NSLog(@"%@", [calc sumAddend1 : addend1 : addend3];
  }
}

我们也可以使用performSelector

SEL selector1 = @selector(sumAddend1 : addend2:);
id sum1 = [calc performSelector:selector1 withObject:addend1 withObject:addend2];

NSLog(@"%@", sum1);

//sumAddend1 :: 调用方法同理

但是这个使用一般ARC会抛出警告
我们只要把代码前后加上

@pragma clang diagnostic push
@pragma clang dignostic ignored "-Warc-performSelector-leaks"

//code

#pragram clang dignostic pop

@progma clang dignostic ignored “诊断功能的名称” 会忽略掉中间的功能部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值