在ios下的excel是excel怎么写公式出来的?用objective c重写一遍

Objective-C 消息转发 - CSDN博客
Objective-C 消息转发
Objective-C 消息转发
一.消息转发流程
当向Objective-C对象发送一个消息,但runtime在当前类及父类中找不到此selector对应的方法时,消息转发(message forwarding)流程开始启动。
动态方法解析(Dynamic Method Resolution或Lazy method resolution)
向当前类(Class)发送(对于类方法则为)消息,如果返回YES,则系统认为请求的方法已经加入到了,则会重新发送消息。
快速转发路径(Fast forwarding path)
若果当前target实现了方法,则调用此方法。如果此方法返回除nil和self的其他对象,则向返回对象重新发送消息。
慢速转发路径(Normal forwarding path)
首先runtime发送消息查看Selector对应的方法签名,即参数与返回值的类型信息。如果有方法签名返回,runtime则根据方法签名创建描述该消息的,向当前对象发送消息,以创建的NSInvocation对象作为参数;若methodSignatureForSelector:无方法签名返回,则向当前对象发送消息,程序抛出异常退出。
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MessageInterceptor test]: unrecognized selector sent to instance 0x9589830'
二.动态解析(Lazy Resolution)
runtime发送消息的流程即查找该消息对应的方法或IMP,然后跳转至对应的IMP。有时候我们不想事先在类中设置好方法,而想在运行时动态的在类中插入IMP。这种方法是真正的快速”转发”,因为一旦对应的方法被添加到类中,后续的方法调用就是正常的消息发送流程。此方法的缺点是不够灵活,你必须有此方法的实现(IMP),这意味这你必须事先预测此方法的参数和返回值类型。
属性是使用动态解析的一个例子,@dynamic告诉编译器该属性对应的getter或setter方法会在运行时提供,所以编译器不会出现warning;
然后实现方法在运行时将属性相关的方法加入到Class中。
当或方法被调用时,若该方法在类中未实现,动态方法解析器也会被调用,这时可向类中增加IMP,并返回YES,则对应的respondsToSelector:的方法也返回YES。
三.快速转发(Fast Forwarding)
runtime然后会检查你是否想将此消息不做改动的转发给另外一个对象,这是比较常见的消息转发情形,可以用较小的消耗完成。
快速转发技术可以用来实现伪多继承,你只需编写如下代码
- (id)(SEL)sel { return _otherO }
这样做会将任何位置的消息都转发给_otherObject对象,尽管当前对象与_otherObject对象是包含关系,但从外界看来当前对象和_otherObject像是同一个对象。
伪多继承与真正的多继承的区别在于,真正的多继承是将多个类的功能组合到一个对象中,而消息转发实现的伪多继承,对应的功能仍然分布在多个对象中,但是将多个对象的区别对消息发送者透明。
四.慢速转发(Normal Forwarding)
以上两者方式是对消息转发的优化,如果你不使用上述两种方式,则会进入完整的消息转发流程。这会创建一个NSInvocation对象来完全包含发送的消息,其中包括target,selector,所有的参数,返回值。
在runtime构建NSInvocation之前首先需要一个,所以它通过方法请求。一旦NSInvocation创建完成,runtime就会调用forwardInvocation:方法,在此方法内你可以使用参数中的invocation做任何事情。无限可能…
举个例子,如果你想对一个NSArray中的所有对象调用同一个方法,而又不想一直写循环代码时,想直接操作NSArray时,可这样处理:
@implementation NSArray (ForwardingIteration)
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel
NSMethodSignature *sig = [super methodSignatureForSelector:sel];
for(id obj in self)
if((sig = [obj methodSignatureForSelector:sel]))
- (void)forwardInvocation:(NSInvocation *)inv
for(id obj in self)
[inv invokeWithTarget:obj];
然后就可以这样使用
[(NSWindow *)windowsArray setHidesOnDeactivate:YES];
不过不建议这样使用,因为若NSArray实现了此方法,就不会进入转发流程。实现这种功能的一种比较好的方法是使用NSProxy。
五.方法声明
虽然上述机制可以转发当前类中没有实现的方法,但发送消息时仍然需要知道每个消息的方法签名,否则就会有编译器告警。可以通过category来声明转发消息的方法。
六.使用消息转发在子类中处理Delegate消息
当继承一个具有delgate的类,而又需要在子类中处理某些delegate消息,而又不影响对正常Delegate消息的调用时,需要如何处理呢?
一种方法是将子类对象设为自身的delegate,而将外部设置的delegate存储到另一个参数中。在子类中实现所有的delegate方法,处理子类中需要处理的delegate消息,而将子类中不处理的delegate消息再发送到外部delegate。这种方法的缺点在于实现繁琐,在子类中需要实现所有delegate方法,尽管大部分delegate消息又直接转给了外部delegate处理。
另一种比较优雅的方式是使用消息转发,创建一个proxy类,将proxy类设置为父类的delegate,在proxy中分别将消息转发给子类或外部Delegate。
比如,创建一个UISCrollView的子类可使用如下代码
MessageInterceptor.h
@interface MessageInterceptor : NSObject {
id middleM
@property (nonatomic, assign)
@property (nonatomic, assign) id middleM
MessageInterceptor.m
@implementation MessageInterceptor
@synthesize middleM
- (id)forwardingTargetForSelector:(SEL)aSelector {
if ([middleMan respondsToSelector:aSelector]) { return middleM }
if ([receiver respondsToSelector:aSelector]) { }
return [super forwardingTargetForSelector:aSelector];
- (BOOL)respondsToSelector:(SEL)aSelector {
if ([middleMan respondsToSelector:aSelector]) { return YES; }
if ([receiver respondsToSelector:aSelector]) { return YES; }
return [super respondsToSelector:aSelector];
MyScrollView.h
#import &MessageInterceptor.h&
@interface MyScrollView : UIScrollView {
MessageInterceptor * delegate_
MyScrollView.m
@implementation MyScrollView
- (id)delegate { return delegate_interceptor. }
- (void)setDelegate:(id)newDelegate {
[super setDelegate:nil];
[delegate_interceptor setReceiver:newDelegate];
[super setDelegate:(id)delegate_interceptor];
- (id)init* {
delegate_interceptor = [[MessageInterceptor alloc] init];
[delegate_interceptor setMiddleMan:self];
[super setDelegate:(id)delegate_interceptor];
- (void)dealloc {
[delegate_interceptor release];
// delegate method override:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
// 1. your custom code goes here
// 2. forward to the delegate as usual
if ([self.delegate respondsToSelector:@selector(scrollViewDidScroll:)]) {
[self.delegate scrollViewDidScroll:scrollView];
MessageInterceptor对象会自动将将子类中实现的delegate消息转发给子类,而将其他所有delegate消息转发给外部设置的delegate对象。
在MessageInterceptor中除了实现forwardingTargetForSelector:方法外,还实现了respondsToSelector:方法,因为UIScrollView在发送delegate消息之前会首先使用判断delegate是否实现了该方法,而转发的消息对respondsToSelector:也应返回YES。
This entry was posted in&&and
tagged&,&.
Bookmark the&.
Leave a Reply
Your email address will not be published.
You may use these&HTML&tags
and attributes:&&a
href=&& title=&&& &abbr title=&&& &acronym title=&&& &b& &blockquote cite=&&& &cite& &code& &del datetime=&&& &em& &i& &q cite=&&& &strike& &strong&
Protected by&
本文已收录于以下专栏:
相关文章推荐
问题1:如何获取caller的(文件名,行号,函数名)?
    当新增一条log记录时,最终将调用Logger类的_log方法,这个方法首先会创建一个LogRecord对象。LogReco...
NetworkTool.h亲测可用,能正常获取数据(已后台返回的json数据作为测试的)//
NetworkTool.h
Created by zhouyu on 16/10/2...
日常开发中,有时调用对象的某个方法,会出现异常,如下:
*** Terminating app due to uncaught exception 'NSInvalidArgumentExceptio...
我们要通过一个小例子来简单、通俗的理解一下什么是消息转发以及如何消息转发,希望看完这篇文章时大家会彻底的明白OC的消息。
首先,你需要知道这两个概念:
首先,你需要知道这两个概念:
OC中调用方法就是向对象发送消息。
[person run];
这实际上这是在给person这个对象发送run这个消息。
那么问题来了,当ru...
我们要通过一个小例子来简单、通俗的理解一下什么是消息转发以及如何消息转发,希望看完这篇文章时大家会彻底的明白OC的消息。
首先,你需要知道这两个概念:
OC中调用方法就是向对象发送消息...
第11条:理解objc_msgSend的作用
    在对象上调用方法是Objective-C中经常使用的功能。用Objective-C术语来说这叫做:“传递消息”(pass a message)。消...
首先感谢这几个篇文章:
http://blog.csdn.net/mangosnow/article/details/
.cn/s/blog...
学了那么久的Objective-C,给我的感觉就是它什么都是动态的,你将会听到一个新的名词:
一、动态方法解析
1、+(BOOL) resolveInstanceMethod:(SEL) ...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Objective-C中,重写init方法为什么要self = [super init]? - CSDN博客
Objective-C中,重写init方法为什么要self = [super init]?
这些问题可能Google一下你的收获会更大。
通过你问的问题,可能你还是第一次接触编程语言,或是面向对象语言。你需要了解面向对象的一些概念,相信你认真地把官方文档的 programming with objective-c 研读一遍的话,会有更好的体会。
我们需要知道面向对象继承的概念,一个子类从父类继承,获得相关的属性和方法,所以在子类的初始化方法中,必须首先调用父类的初始化方法,以实现父类相关资源的初始化。
网上有网友总结的很好:
1.[super init]的作用:
面向对象的体现,先利用父类的init方法为子类实例的父类部分属性初始化。
2.self 为什么要赋值为[super init]:
简单来说是为了防止父类的初始化方法release掉了self指向的空间并重新alloc了一块空间。这时的话,[super init]可能alloc失败,这时就不再执行if中的语句。
同样也是面向对象的概念,调用的方法如果是继承自父类的,的确是调用了父类的方法的代码,如果是自己新添加的方法,则调用是原原本本自己的方法。
然后就是在Objective-C发送消息(调用方法)是通过方括号语法来调用的。
本文已收录于以下专栏:
相关文章推荐
iOS重写父类中的方法时要先调用父类中的方法的原因
初学OC,对init这个方法不是很了解。我们现在来分别对init方法进行重写以及自定义,来加深对他的了解。本例子也是用Person类来进行测试。
(一)重写init方法。
(1)在Person.h中声...
ios自定义View:init和initWithFrame方法
[/questions//why-uiview-cal...
1、所有的类调用alloc方法来分配内存
2、init方法完成初始化
init方法虽然 可以完成初始化,但是由于它是完成最基本的初始化,因此,对象的所有成员变量依然是0;
我们可以重写初始化方法:...
今天在学习Objective-C时见到某初始化函数中有如下代码:
    self = [super init];
    if(self){
// Initialize membe...
今天在学习Objective-C时见到某初始化函数中有如下代码:
    self = [super init];
    if(self){
// Init...
我们先假设现在自己创建了个类,我们起名叫MyObject,继承于NSObject。
继承知道吧,就是你这个子类(MyObject)如果什么都不写的话,和父类(NSObject)就是一模一样的。
一、OC实例变量的可见度
1、三种类型的可见度
用@public修饰的实例变量,在类的内部和外部都可以使用,不推荐(禁止)使用。
@protected  
用@protected修...
转载请标明出处:http://blog.csdn.net/zhangxingping
分配并初始化对象
分配并初始化对象
    在Objective-C中创建一个对象需要两步:
  ...
随着时间的跟进,我们来到了今天,今天会介绍Objective-C中方法的语法结构,着重介绍几类型重点方法捎带一点数据类型。
1. setter 和 getter 方法 setter方法是用来给成员变...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)主题 : 如何通过Objective-C解析Excel
级别: 禁止发言
可可豆: 1078 CB
威望: 1078 点
在线时间: 4(时)
发自: Web Page
用户被禁言,该主题自动屏蔽!
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版objective-c中的静态函数实现 - CSDN博客
objective-c中的静态函数实现
根据你的情况在哪个代码文件里增加,我是在AppDelegate里添加的
1、在AppDelegate.h中增加函数声明
+ (NSString*)getCurrentTimeS
2、在AppDelegate.m中增加函数主体
/*获得字符串格式的当前时间*/
+ (NSString*)getCurrentTimeString
&&& NSDate*curTime = [NSDate date];// 获取本地时间
&&& NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
&&& [formatter setDateFormat:@&yyyy-MM-dd hh:mm:ss&];& // 格式化时间NSDate
&&& NSString*stringFromDate = [formatter stringFromDate:curTime];
&&& return stringFromD
3、在需要调用的代码中
#import &AppDelegate.h&
[AppDelegate getCurrentTimeString];
本文已收录于以下专栏:
相关文章推荐
HttpClient client = new HttpClient();
PostMethod method = new PostMethod(Ur...
“BDUSS是登录百度(web/wap)后的唯一身份凭证(*.),受http-only保护,拿到BDUSS就等于拿到帐号的控制权,通行贴吧、知道、百科、文库、空间、百度云等百度主要产...
作为初学者,相信大家都对objective-c的静态数据成员和静态成员函数都挺纠结的,我现在和大家分享下我对这个知识点的理解,请大家多多指点....
如果大家学过C++,那么都应该知道和了解静态数据...
利用Objective-C的反射机制和运行时特性实现类静态方法的动态访问,解决不能使用NSObject类的反射方法 performSelector 访问静态方法的坑爹问题!
今天在学习Objective-C时见到某初始化函数中有如下代码:
    self = [super init];
    if(self){
// Initialize membe...
今天在学习Objective-C时见到某初始化函数中有如下代码:
    self = [super init];
    if(self){
// Init...
在编写iphone开发时,最常用的就是回调函数。自己编写回调函数,实现动态加载数据,加载完数据之后就利用回调函数通知给前台页面,显示相应数据的界面。在iphone中利用协议可以很容易的实现回调函数,后...
Objective-C利用协议实现回调函数
实现一个显示文字为测试的视图,然后经过3秒钟测试文字变为回调函数文字。相应的截图如下:
实现的代码如下:
在编写android开发时,最常用的就是回调函数。自己编写回调函数,实现动态加载数据,加载完数据之后就利用回调函数通知给前台页面,显示相应数据的界面。在iphone中利用协议可以很容易的实现回调函数,...
在编写android开发时,最常用的就是回调函数。自己编写回调函数,实现动态加载数据,加载完数据之后就利用回调函数通知给前台页面,显示相应数据的界面。在iphone中利用协议可以很容易的实现回调函数,...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 excel怎么写函数 的文章

 

随机推荐