OC中的SEL与C中的const void *

开头先说明一下,之所以把这二者放在一起比较,是因为今天看到了一个很有趣的写法

- (void)setLk_imageInfo:(LKImageInfo *)imageInfo
{
    objc_setAssociatedObject(self, @selector(setLk_imageInfo:), imageInfo, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

我们都知道,在OC中如果想给分类添加属性@property是不能直接生成对应的settergetter的而且即使手写settergetter也不能使用实例变量,所以只能通过runtime中这种关联的形式来绑定特定对象。
再来看一下objc_setAssociatedObject的定义:

objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key,
                         id _Nullable value, objc_AssociationPolicy policy)

可以看到第二个参数key 需要一个 const void *类型的参数作为绑定的key,以往我在使用这个方法的时候都会自己生成一个key,而今天看到的代码中则使用了@selector(setLk_imageInfo:),传入了一个SEL,对此我也做了简单的实验。

先来看一下SEL的定义:

/// An opaque type that represents a method selector.
typedef struct objc_selector *SEL;

可以看到SEL是一个结构体指针,而 const void *是一个无类型指针常量,所以从 SEL -> const void*来赋值是说得通的,但是如果想反过来使用是不可以的。

const void *sel = @selector(beginTimer);
Obj *obj = [Obj new];
[obj performSelector:sel];

最开始对sel的赋值并不会有警告,因为void*本身就是无类型,但是这段代码将无法执行并且报错。

最后,今天也算是学到了一个写关联的时候偷懒的好方法:D。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,879评论 0 9
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 5,716评论 0 4
  • 今日体验,与各个机修组长聊天沟通,询问一年赚了多少钱,服务了多少客户,创造了多大价值,大家都是混沌的!不清晰!只记...
    王海博阅读 1,292评论 0 0
  • 聂光仙,女笔名登霞、1936年出生,汉,山西寿人生,任教37年,荣获"杰出华人書画家"、"中华老年艺术家"称号! ...
    王成山阅读 1,526评论 0 0
  • 现在又是毕业季了。这让我想起一些事。记得那年我毕业的时候,几次和兄弟们喝酒,我在哈哈哈大笑,他们却在哭。有时我说话...
    _浅墨_阅读 3,759评论 0 4

友情链接更多精彩内容