首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

将@objc方法作为操作添加到按钮并获取“'#selector‘的参数不引用'@objc’方法、属性或初始值设定项”

将@objc方法作为操作添加到按钮并获取“'#selector'的参数不引用'@objc’方法、属性或初始值设定项”是一个编程中常见的错误提示。这个错误通常发生在使用Objective-C的语法和特性时,而编译器无法正确识别和处理。

首先,@objc是Objective-C的一个修饰符,用于将Swift中的方法、属性或类暴露给Objective-C代码。在Swift中,我们可以使用@objc修饰符来声明一个方法或属性,以便在Objective-C中使用。

当我们尝试将一个使用了@objc修饰符的方法作为操作添加到按钮时,我们需要使用#selector来引用这个方法。然而,编译器会在这种情况下发出警告或错误,提示我们参数不引用@objc方法、属性或初始化项。

这个错误通常是由于以下几种情况引起的:

  1. 方法名错误:请确保使用正确的方法名来引用@objc方法。方法名是区分大小写的,所以请确保大小写匹配。
  2. 方法不是@objc方法:请确保要添加到按钮的方法使用了@objc修饰符。如果方法没有使用@objc修饰符,编译器将无法正确识别和引用该方法。
  3. 方法不可见:请确保要添加到按钮的方法在当前作用域中可见。如果方法是私有的或在其他模块中不可见,编译器将无法引用该方法。
  4. 方法签名错误:请确保方法的参数和返回类型与按钮操作的期望相匹配。如果方法签名不匹配,编译器将无法正确引用该方法。

解决这个问题的方法包括:

  1. 确保方法使用了@objc修饰符,并且在当前作用域中可见。
  2. 检查方法名的拼写和大小写,确保与引用时一致。
  3. 检查方法的参数和返回类型,确保与按钮操作的期望相匹配。

如果以上方法都没有解决问题,可能需要进一步检查代码逻辑和上下文,以确定是否存在其他问题。

对于这个问题,腾讯云没有特定的产品或链接来解决,因为它是一个与云计算无关的编程错误。然而,腾讯云提供了丰富的云计算产品和服务,可以帮助开发人员构建和部署各种应用程序。您可以访问腾讯云官方网站(https://cloud.tencent.com/)了解更多信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS开发·runtime原理与实践: 关联对象篇(Associated Object)(应用场景:为分类添加“属性”,为UI控件关联事件Block体,为了不重复获得某种数据)

本文中,第一节将介绍关联对象及如何关联对象,第二节将介绍关联对象最常用的一个实战场景:为分类添加属性,第三节将介绍关联对象另一个很重要的实战场景:为UI控件(比如,UIAlertView以及UIButton...alertView参数,并据此选用相应的逻辑。...创建完警告视图之后,设定一个与之关联的“块”(block),等到执行delegate方法时再将其读出来。下面对此方案进行改进。...有没有办法让方法只执行一次,每次调用方法的时候直接获得那一次的执行结果?有的,方案就是让某个对象的方法获得的数据结果作为“属性”与这个对象进行关联。...获取`类`的属性 /** 参数 1> 类 2> 属性的计数指针 */ unsigned int count = 0; // 返回值是所有属性的数组

2.9K20

iOS开发·runtime原理与实践: 基本知识篇(类,超类,元类,super_class,isa,对象,方法,SEL,IMP)

( Method m ); // 获取方法的返回值类型的字符串 char * method_copyReturnType ( Method m ); // 获取方法的指定位置参数的类型字符串 char...m ); // 通过引用返回方法指定位置参数的类型字符串 void method_getArgumentType ( Method m, unsigned int index, char *dst,...struct objc_selector *SEL; 在源码中没有直接找到 objc_selector 的定义,从一些书籍上与 Blog 上看到可以将 SEL 理解为一个 char* 指针。...操作函数 // 返回给定选择器指定的方法的名称 const char * sel_getName ( SEL sel ); // 在Objective-C Runtime系统中注册一个方法,将方法名映射到一个选择器...指向方法selector的指针与该字段做一个AND位操作(index = (mask & selector))。这可以作为一个简单的hash散列算法。

1.7K40
  • Objective-C Runtime 的一些基本使用

    接下来我们来一一介绍获取类中属性和方法的方法。当然不要忘了#import objc/runtime.h>....获取类中的成员变量 我们可以发现获取类中的方法,属性过程基本一致:通过元类获取方法列表或属性列表,然后在进行遍历。...编译错误,提示实例变量无法添加到分类中,用正常的方法确实无法在分类中添加属性。 但是可以通过Runtim机制进行“添加”。其本质是给这个类添加属性关联,而非把这个属性添加到类中。...,也就是 Objc 内存管理的引用计数机制。...}; objc_getAssociatedObject(id object, const void *key) 方法通过 object 与 Key 直接获取关联的属性值 上面代码中的第二个参数写的是 _

    1.2K80

    Objective-C Runtime:深入理解类与对象

    其实最主要的表现就是Objective-C将很多静态语言在编译和链接时做的事情放到了运行时去做,它在运行时实现了对类、方法、成员变量、属性等信息的管理机制。...类的操作方法大部分是以class_ 为前缀的,而对象的操作方法大部分是以objc_或object_为前缀,具体以分类的形式进行讨论。...2、属性相关的操作函数: // 获取指定的属性 objc_property_t class_getProperty ( Class cls, const char *name ); // 获取属性列表...函数:销毁一个类的实例,但不会释放并移除任何与其相关的引用; 实例操作函数 实例操作函数主要是针对我们创建的实例对象的一系列操作函数。...类B通过添加一些额外的属性来扩展类A。现在我们创建了一个A类的实例对象,并希望在运行时将这个对象转换为B类的实例对象,这样可以添加数据到B类的属性中。

    1.3K40

    NSObject头文件解析 消息机制 Runtime解读 (一)

    Class类作为成员变量, 稍后我们再具体看看Class的头文件 } //load & initilize方法我们不常用到, 进一步的说明大家可以看下这个地址:http://www.cocoachina.com...标记的属性是Ojective-C 2.0不支持的,但实际上可以用响应的函数获取这些属性,具体有哪些响应函数大家可以导入objc/runtime.h>后输入class_get...看看 例如:如果想要获取...(也可以还带有参数), 对象接收到消息后会先在cache中找之前的调用记录, 在调用记录中找到了该方法就直接运行, 找不到就去方法列表去找 还找不到就去父类去找 如果找到顶层还是没有, 一般情况下在我们没有进行任何操作的时候会...crash 如果要对没有实现的方法调用做一些操作, 就可以在动态解析/重定向/消息转发中来做处理, 在其中任何一个阶段有处理该方法调用就不会crash 更详细的用法之前讲过, 请看: http://www.cnblogs.com...72477] 打印成员变量初始值: (null) 2017-02-02 11:41:28.161 RunTimeDemo[1271:72477] 打印修改后成员变量的值: nihao 获取实例方法: Method

    1.3K31

    2020-iOS最新面试题解析—1(原理篇)

    ,那么可以执行比较耗时的操作; 如果在主线程发的通知,那么就不可以执行比较耗时的操作 runtime 如何实现 weak 属性 首先要搞清楚weak属性的特点 weak策略表明该属性定义了一种“非拥有关系...为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。...用 weak 指向的对象内存地址作为 key,当此对象的引用计数为0的时候会调用对象的 dealloc 方法, 假设 weak 指向的对象内存地址是a,那么就会以a为key,在这个 weak hash表中搜索...函数第一个参数self * 第二个成员是记录当前类的父类是什么,告诉程序从父类中开始找方法,找到方法后,最后内部是使用 objc_msgSend(objc_super->receiver, @selector...以及参数类型,其实selector本质就是方法名称,通过这个方法名称就可以在方法列表中找到对应的方法实现.

    1.7K21

    Objective-C对象引用

    您可能想要引用一个对象而不妨碍对象本身的回收。对于这种情况,您可以获取一个“弱”引用。弱引用是通过存储一个指向对象的指针创建的,而不是保留对象。...强引用(持有对象Retain):当前对象被其他对象引用时,会执行retain操作,引用计数器+1。...二、循环引用 对象 A 和对象 B,相互引用了对方作为自己的成员变量,只有当自己销毁时,才会将成员变量的引用计数减 1。...不会在属性清空后将引用指针清空,这会造成野指针,所以是由风险去访问一个已经被清除的对象的。...但是我们可以用另外的一种方法来关联一个weak属性,那就是强关联一个对象,然后让这个对象来弱引用这个属性。

    84520

    Objective-C Runtime 详解

    PS:任性的话可以在Category中添加@dynamic的属性,并利用运行期动态提供存取方法或干脆动态转发;或者干脆使用关联度对象(AssociatedObject) 其中objc_ivar_list...但此时获取的属性名是不带下划线的,得到属性或者变量名后我们就可以使用KVC去修改访问类中的私有属性或变量。所以OC中没有真正意义上的私有变量,私有方法也是。...我们可以实现forwardInvocation:方法来对不能处理的消息做一些默认的处理,也可以将消息转发给其他对象来处理,而不抛出错误。...( id object ); 这些方法以键值对的形式动态地向对象添加、获取或删除关联值。...dispatch_once 是GCD中的一次性方法,它保证了代码块只执行一次,并让其为一个原子操作,线程安全是很重要的。

    1.2K20

    Objective-C Runtime详解

    PS:任性的话可以在Category中添加@dynamic的属性,并利用运行期动态提供存取方法或干脆动态转发;或者干脆使用关联度对象(AssociatedObject) 其中objc_ivar_list...但此时获取的属性名是不带下划线的,得到属性或者变量名后我们就可以使用KVC去修改访问类中的私有属性或变量。所以OC中没有真正意义上的私有变量,私有方法也是。...我们可以实现forwardInvocation:方法来对不能处理的消息做一些默认的处理,也可以将消息转发给其他对象来处理,而不抛出错误。...( id object ); 这些方法以键值对的形式动态地向对象添加、获取或删除关联值。...dispatch_once 是GCD中的一次性方法,它保证了代码块只执行一次,并让其为一个原子操作,线程安全是很重要的。

    1.8K60

    面经之《招聘一个靠谱的iOS》import CYLBlockExecutor.himport CYLBlockExecutor.himport CYLNSObject+RunAtDeallo

    举个例子,假如 CYLUser 中含有一个数组,与其他 CYLUser 对象建立或解除朋友关系的那些方法都需要操作这个数组。那么在这种情况下,你得把这个包含朋友对象的数组也一并拷贝过来。...我们可以设计一个函数(伪代码)来表示上述机制: objc_storeWeak(&a, b)函数: objc_storeWeak函数把第二个参数--赋值对象(b)的内存地址作为键值key,将第一个参数--...下面分别介绍下方法的内部实现: objc_initWeak函数的实现是这样的:在将“附有weak修饰符的变量(obj1)”初始化为0(nil)后,会将“赋值对象”(obj)作为参数,调用objc_storeWeak...函数将0(nil)作为参数,调用objc_storeWeak函数。...... */ objc_storeWeak(&obj1, 0); objc_storeWeak 函数把第二个参数--赋值对象(obj)的内存地址作为键值,将第一个参数--weak修饰的属性变量(obj1

    1K100

    深入浅出 Runtime(二):数据结构

    isa操作相关 弱引用相关 关联对象相关 内存管理相关 ... */ }; 2. objc_class Class指针用来指向一个 Objective-C...oldCapacity = capacity(); // ⚠️将缓存扩容为原来的两倍,如果是首次调用,设置缓存容量的初始值为 4 uint32_t newCapacity = oldCapacity...,请查看: 深入浅出 Runtime(三):消息机制 3. isa 指针 isa指针用来维护对象和类之间的关系,并确保对象和类能够通过isa指针找到对应的方法、实例变量、属性、协议等; 在 arm64...(返回值类型、参数类型) IMP imp; // 方法的地址/实现 }; 4.1 SEL SEL 又称“选择器”,它是一个指向方法的selector的指针,代表方法/函数名; SEL 维护在一个全局的...,把一个方法的返回值类型、参数类型通过字符串的形式描述; @encode()指令可以将类型转换为 Type Encodings 字符串编码, 如@encode(int)=i; OC方法都有两个隐式参数

    82610

    神奇的Runtime

    指针), 调用方法的选标 SEL (方法名),以及不定个数的方法参数,并返回一个id。...否则 4、寻找父类的method list,并依次往上寻找(会找到NSObject),直到找到selector,填充到缓存中,并返回selector,否则 动态解析,这里动态添加方法 5、如果找到可以动态...,不缓存,方法返回,否则 消息快速转发,这里将消息分配给其他对象处理 6、消息转发机制执行前,Runtime 系统允许我们替换消息的接收者为其他对象。...:消息,以创建的NSInvocation对象作为参数; 若methodSignatureForSelector:无方法签名返回,则向当前对象发送doesNotRecognizeSelector:消息,程序抛出异常退出...通过这种方法来模拟生成属性,但是与对象还是有点区别,因为对象属性会编译器自动生成setter和getter方法,会默认给你生成一个以下划线开头的成员变量,而category不手动去生成setter和getter

    61720

    Swift编译之SIL(Swift Intermediate Language)

    witness_method:通过 Protocol Witness Table(PWT) 获取对应的方法引用地址。 objc_method:获取 Objective-C 方法引用地址。...@方法名:某个方法的名字。 @_hasStorage:存储属性。 @_hasInitialValue:属性有初始值。 @owned:方法接收者负责销毁返回值。...,将方法导出到Objective-C,并启用动态派发 @objc dynamic func say() // 没有@objc标记的普通方法 func doSomething()...:表示这个表达式是隐藏的,即不对外部可见 // [transparent]:表示这个表达式是透明的,即不包含额外的控制流或操作 // @variable initialization expression...方法的调用约定,其中@yield_once表示该方法会产生一次yield modify 方法通常用于实现属性的写时拷贝,在获取属性时会执行一些操作,并在修改时生成一个拷贝 // @convention(

    30941

    iOS-RunTime,不再只是听说

    使用运行时,发送消息需要导入框架objc/message.h>并且xcode5之后,苹果不建议使用底层方法,如果想要使用运行时,需要关闭严格检查objc_msgSend的调用,BuildSetting...(eat)); // 带参数 objc_msgSend(p, @selector(eat:),10); 类方法的调用底层 // 本质是会将类名转化成类对象,初始化方法其实是在创建类对象。...实例方法[p eat];底层调用[p performSelector:@selector(eat)];方法,编译器在将代码转化为objc_msgSend(p, @selector(eat)); 在objc_msgSend...每一个方法都默认带有两个隐式参数 self : 方法调用者 _cmd : 调用方法的标号,可以写也可以不写。...参数二:void * == id key : 属性名,根据key获取关联对象的属性的值,在objc_getAssociatedObject中通过次key获得属性的值并返回。

    1.3K70

    iOS_Runtime是什么?原理?作用?怎么实现weak?使用

    就是在程序运行的过程中,有一套C语言级别的API,它把代码从OC转换成C 2、原理: OC是基于C,并添加了面向对象的特性,将很多静态语言在编译和链接时做的事放到了runtime运行时来处理 C:函数的调用在编译时就知道会调用哪个函数...OC:在编译的时候并不知道,只在正在运行时才会根据函数名称找到对应的函数 3、作用 获取属性、方法、成员变量、协议(包括私有的) 给分类动态添加属性、方法 字典转模型 拦截并替换方法 实现NSCoding...当对象的引用计数为0时会调用dealloc方法,此时会在weak表中搜索,将所有weak对象置为nil。...Key:对象内存地址 — value:n个weak对象 5、使用 替换ViewController生命周期方法 解决获取索引、添加、删除元素越界crash问题 防止按钮重复暴力点击 全局更换控件初始效果...} // 还有些属性,没添加,详情见Demo `UILabel`的`Category`中拦截初始化方法,并设置font // UILabel+Swizzling.m + (void)load {

    40220

    iOS16 和 Xcode14 如何改进 App 大小和运行时性能

    其实可以看到这里几乎每一行都要一条指令来调用 objc_msgSend, 即使是对日期的属性访问(属性的 setter 方法)。...每个类都有一张方法列表来存储这个类的方法列表,当调用 objc_msgSend 时,就会通过参数去这个对应对应的类的方法列表中查找,先在cache 中查找,然后在方法列表中查找,如果当前类找不到,就往上找父类...在高代码层面(比如业务层面,应用层),当我们复制指向某个对象的指针时,需要增加对象的引用计数,让该对象保持活跃的引用状态(copy方法就会做这个事)。...操作推迟到稍后某个时间的方法。..., 我们将返回一个将立即被持有(retain) 的临时变量(theWWDCDate),这让我们可以省略或删除正在匹配的 autorelease 和 retain 调用。

    4K30

    Objective-C Runtime编程指南(1)

    这意味着该语言不仅需要编译器,还需要运行时系统来执行编译的代码。运行时系统作为Objective-C语言的一种操作系统来使得Objective-C工作的。...编译器会将一个下面的一个消息表达式 [receiver message] 转变成一个消息函数 objc_msgSend,这个函数将接收者和消息中提到的方法的名称(即方法selector)作为其两个主要参数...如果在那里找不到selector,objc_msgSend将跟随指向超类的指针,并尝试在其派发表中找到selector。...规避动态绑定的唯一方法是获取方法的地址,并直接调用它,就像它是一个函数一样。...Objective-C方法只是一个C函数,它至少需要两个参数self和_cmd。 您可以使用函数class_addMethod将函数添加到类中。

    82120

    iOS运行时Runtime基础

    第一步:编译阶段 [receiver selector]方法被编译器转化,分为两种情况: 1.不带参数的方法被编译为:objc_msgSend(receiver,selector) 2.带参数的方法被编译为...ivars: ivars用于存放所有的成员变量和属性信息,属性的存取方法都存放在methodLists中。 methodLists: methodLists用于存放对象的所有成员方法。...获取的不仅有实例变量还有属性: Ivar *ivarList = class_copyIvarList([self class], &count); for (int i= 0; i方法解析的操作为其他添加方法实现,具体代码如下: //Person.h文件 @interface Person : NSObject //声明类方法,但未实现 + (void...所以我们可以重写这个方法:对不能处理的消息做一些默认处理,也可以将消息转发给其他对象来处理,而不抛出错误。

    93430
    领券