Cocoa 编程开发者手册 阅读笔记(一)

发布于 2022-06-15 03:02:15 字数 1617 浏览 1021 评论 0

该书有点年代,讲的OC都是不带ARC的。用Xcode9的话,书中的例子甚至都不能通过编译,网上也鲜有人提及修改的方法,在此把折腾的东西做个记录。

P87 中提及了 利用该机消息枚举,实质是给容器生成一个代理对象,而向代理对象发送消息的话会将消息转发到容器中的每一个对象,并将调用的结果存入数组中返回。

修改后可通过编译的代码如下:

NSArray+map.h

#import <Foundation/Foundation.h>
@interface NSArray (AllElements)
- (id) map;
@end

@interface NSArrayMapProxy: NSProxy {
    NSArray* array;
}
-  (instancetype) initWithArray: (NSArray*) anArray;
@end

NSArray+map.m

#import "NSArray+map.h"
@implemetation NSArray (AllElements) 
- (id) map {
    return [[NSArrayMapProxy alloc] initWithArray: self];
 }

@end



@implemetation NSArrayMapProxy: NSProxy 
-  (instancetype) initWithArray: (NSArray*) anArray {
    array = anArray;
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
    for (id obj in array) {
        if ([obj respondsToSelector:sel]) {
            return [obj methodSignatureForSelector:sel];
        }
    }
    return [super methodSignatureForSelector:sel];
}
- (void)forwardInvocation:(NSInvocation *)invocation {
    SEL selector = [invocation selector];
    NSMutableArray* mutableArray = [NSMutableArray arrayWithCapacity:[array count]];
    for (id obj in array) {
        if ([obj respondsToSelector:selector]) {
            [invocation invokeWithTarget:obj];
            id mapped;
            [invocation getReturnValue:&mapped];
            [mutableArray addObject: mapped];
        }
    }
   // 重要,实质上这里是进入了C field,如果不手动retain的话,数组就会被自动释放了
    CFBridgingRetain(mutableArray);
    [invocation setReturnValue: &mutableArray];
}
@end

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

鹤舞

暂无简介

0 文章
0 评论
603 人气
更多

推荐作者

漫雪独思

文章 0 评论 0

垂暮老矣

文章 0 评论 0

鹊巢

文章 0 评论 0

萌酱

文章 0 评论 0

雨说

文章 0 评论 0

冰葑

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文