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

为什么Objective-C不能在受保护的函数指针中使用“self”对象?

Objective-C是一种面向对象的编程语言,它是基于C语言的扩展,主要用于开发iOS和macOS应用程序。在Objective-C中,使用关键字"self"来表示当前对象的指针。然而,在受保护的函数指针中,不能使用"self"对象的原因如下:

  1. 函数指针是一种特殊的指针类型,它指向函数的内存地址。当我们将一个函数指针传递给其他函数或存储在数据结构中时,它可能会在不同的上下文中被调用。而"self"对象是一个特定的实例对象,它只在类的方法中才有意义。因此,在函数指针中使用"self"对象可能会导致错误的行为或内存访问问题。
  2. 受保护的函数指针通常用于回调函数或委托模式中,用于在特定事件发生时调用相应的函数。这些函数通常是独立于任何特定对象的,因此没有"self"对象的概念。在这种情况下,使用"self"对象是没有意义的,也可能会导致代码逻辑混乱。

总结起来,Objective-C中的受保护的函数指针不支持使用"self"对象是因为函数指针是独立于任何特定对象的,而"self"对象只在类的方法中有意义。在使用受保护的函数指针时,应该避免使用"self"对象,以确保代码的正确性和可维护性。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云官网:https://cloud.tencent.com/
  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 云原生应用引擎 TKE:https://cloud.tencent.com/product/tke
  • 人工智能平台 AI Lab:https://cloud.tencent.com/product/ai
  • 物联网平台 IoT Hub:https://cloud.tencent.com/product/iothub
  • 移动开发平台 MTA:https://cloud.tencent.com/product/mta
  • 云存储 COS:https://cloud.tencent.com/product/cos
  • 区块链服务 BaaS:https://cloud.tencent.com/product/baas
  • 腾讯云元宇宙:https://cloud.tencent.com/solution/virtual-universe
相关搜索:Typescript :使用受保护的构造函数实例化抽象类中的子类为什么我们不能在Elixir的保护子句或宏中使用其他函数?为什么我不能在我的kv文件的构造函数中引用self.text_1?基类的友元类如何使用基类中受保护的纯虚函数?为什么在Objective-C中没有将'id'类型的对象初始化为带有'*'的指针?为什么我的异步函数不返回node.js中的对象?为什么使用PDFBOX的受密码保护的PDF在Microsoft Edge浏览器中打开时没有密码?Java Spring -使用API持久化对象有效,但我不能在测试中持久化带有服务的对象,空指针为什么python中set对象中的add函数不能使用=?为什么yyclearin的使用不能在野牛中触发%析构函数在Kotlin中不能在对象的超类构造函数中使用常量为什么我不能在google form中自动填充的查找函数中使用arrayformula?为什么我的对象不能在框架中显示,尽管我在Java中使用JLayeredpane?当我在构造函数中创建线程时,为什么实例化一个对象和一个对象指针的行为不同?为什么我不能在Objective-C中的switch-case语句中使用我的常量?[error = Expression不是整数常量表达式](使用Javascript对象进行实验)为什么我的函数在另一个函数中不起作用?为什么我不能使用在jquery对象中创建的javascript函数,以及如何在jquery中声明自定义函数?为什么我们使用指向整数的指针作为max stl函数,而不是用于c++中的字符数组的size_t数据类型(通常使用)?静态成员变量只能在类的静态方法中使用,但是为什么我们可以在C++类的构造函数中为静态变量赋值呢?为什么这个map函数在react中接收的是对象而不是字符串。我需要使用item.item来呈现一个字符串
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Objective-C属性机制

Objective-C 2.0属性机制为我们提供了便捷获取和设置实例变量方式,也可以说属性为我们提供了一个默认设置器和访问器实现。...在学习OC属性之前我们先要知道为什么要为变量实现getter和setter方法,我们先来了解一下实例作用域。     实例变量作用域如下:         1....@protected :保护,该实例变量只能在该类和其子类内访问,父类protected实例变量在子类是private默认是protected;         3....在使用getter和setter方法时有一点要注意:以neme为例,getter方法名为 name, 而setter名为 setName;在使用getter和setter方法时和普通函数用法一样 ​...weak : 表示弱引用,拥有对象所有权,当目标对象被销毁之后,属性值会被自动设为nil;     ​    ​    ​assign(赋值): 直接赋值,计数器不会加一,简单赋值方法,默认赋值方式

1.3K70

iOS工程师必看 20 道 面试题

而栈上内存系统会自动处理,不会造成野指针。 copy与strong类似。不同之处是strong复制是多个指针指向同一个地址,而copy复制每次会在内存拷贝一份对象指针指向不同地址。...闭包就是没有名字函数,或者理解为指向函数指针。 3....File-private 也是 Swift 3 新添加权限。其被修饰对象能在当前文件中被使用。例如它可以被一个文件 class,extension,struct 共同使用。...Private 是最低访问权限。它对象能在定义作用域内使用。离开了这个作用域,即使是同一个文件其他作用域,也无法访问。 11....具体过程是在Objective-C对象调用方法时,如self.tableview reload,发生了两件事。

3.8K40
  • 神奇Runtime

    NSObject还有些方法能在运行时获得类信息,并检查一些特性,比如class返回对象类;isKindOfClass:和isMemberOfClass:则检查对象是否在指定类继承体系;respondsToSelector... *cache;   //因为Objective-C消息转发需要查找dispatch table甚至可能需要遍历继承体系,所以缓存最近使用方法。       ...,本质上是一个函数指针 } IMP:具体方法地址,IMP 是一个函数指针,这个被指向函数包含一个接收消息对象id(self ...1、不能添加成员变量,会报错 这个函数能在“构建一个类过程”调用。一旦完成类定义,就不能再添加成员变量了 六、KVC与KVO 1、KVC KVC运用了isa-swizzing技术。...isa指针(is kind of 意思)指向维护分发表对象类,该分发表实际上包含了指向实现类方法指针和其他数据。

    60920

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

    ,指向他对象,类对象存放着本对象的如下信息 对象方法列表 成员变量列表 属性列表 每个 Objective-C 对象都有相同结构,如下图所示 | Objective-C 对象结构图 | |...而 super 本质是一个编译器标示符,和 self 是指向同一个消息接受者 * 当使用 self 调用方法时,会从当前类方法列表开始找,如果没有,就从父类再找; * 而当使用 super...能否向运行时创建添加实例变量?为什么?...在Objective-C向nil发送消息是完全有效——只是在运行时不会有任何作用 如果一个方法返回值是一个对象,那么发送给nil消息将返回0(nil) 如果方法返回值为指针类型,其指针大小为小于或者等于...如果向一个nil对象发送消息,首先在寻找对象isa指针时就是0地址返回了,所以不会出现任何错误 objc向一个对象发送消息obj foo和objc_msgSend()函数之间有什么关系?

    1.7K21

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

    遗留下来“传统”,在 MRC ,方法内部 block 是在栈区,使用 copy 可以把它放到堆区.在 ARC 写都行:对于 block 使用 copy 还是 strong 效果是一样,...“属性” (property)作为 Objective-C 一项特性,主要作用就在于封装对象数据。 Objective-C 对象通常会把其所需要数据保存为各种实例变量。...每一个对象内部都有一个isa指针,指向他对象,类对象存放着本对象 对象方法列表(对象能够接收消息列表,保存在它所对应对象) 成员变量列表, 属性列表, 它内部也有一个isa指针指向元对象...每个 Objective-C 对象都有相同结构,如下图所示: enter image description here 翻译过来就是 Objective-C 对象结构图 ISA指针 根类实例变量...这也就是为什么说“推荐在 init 方法中使用点语法”,如果想访问实例变量 iVar 应该使用下划线( _iVar ),而非点语法( self.iVar )。

    1K100

    【IOS开发高级系列】Objective-c Runtime专题总结

    3.2 方法隐藏参数         我们经常在方法中使用 self 关键字来引用实例本身,但从没有想过为什么 self就能取到调用当前方法对象吧。...2) 为什么self.name输出为?         ...7.3 具体使用 7.3.1 创建关联         创建关联要使用Objective-C运行时函数:          objc_setAssociatedObject来把一个对象与另外一个对象进行关联...7.3.2 获取相关联对象         获取相关联对象使用Objective-C函数objc_getAssociatedObject。...通常情况下不建议使用这个函数,因为他会断开所有关联。只有在需要把对象恢复到“原始状态”时候才会使用这个函数

    37130

    16道面试官必问你必须会iOS面试题

    持有,而被别的对象持有,同时产生循环引用时候,就不需要使用 weak self 了。...题目 3:为什么 block 里面还需要写一个 strong self,如果写会怎么样?...另外,有读者评论说使用方括号形式是为了向下兼容 C 语言,我并不觉得括号是唯一选择,C++ 也兼容了 C 语言么?Swift 也可以调用 C 函数么?...题目 11:Objective-C 对象内存结构 isa 指针是用来做什么,有什么用? Objective-C 是一门面向对象编程语言。每一个对象都是一个类实例。...在 Objective-C 语言内部,每一个对象都有一个名为 isa 指针,指向该对象类。每一个类描述了一系列它实例特点,包括成员变量列表,成员函数列表等。

    2.6K50

    property属性相关小记

    ,再将输入对象索引值计数增加1 weak:增加引用计数,持有对象,所以不能决定对象释放,对比assign好处是,当对象消失时指针自动归为nil assign:适用于基础数据类型,增加引用计数,...也可以用retain,blockretain行为默认为copy行为实现,block变量默认是声明为栈变量,为了能在block声明域外使用,所以要把block copy到堆,为了属性声明和实际操作一致...因为他总是在超出他作用域时被自动销毁了 在objective-c只支持一个类型对象:block 堆区(heap):一般由程序员分配释放,若程序员释放,则可能会引起内存泄漏。...在释放时,调用clearDeallocating函数。该函数首先根据对象地址获取所有weak指针地址数据,然后遍历数据把其中数据置为nil,最后把记录从weak表删除,清理对象记录。...protocol是希望遵守协议对象实现该属性;category需要增加属性实现时,需要分别使用两个函数:objc_setAssociatedObject和objc_getAssociatedObject

    1.1K20

    Objective-C Runtime 详解

    NSObject还有些方法能在运行时获得类信息,并检查一些特性,比如class返回对象类;isKindOfClass:和isMemberOfClass:则检查对象是否在指定类继承体系;respondsToSelector...PS:isa指针总是指向实例对象所属类,不能依靠它来确定类型,而是应该用class方法来确定实例对象类。...selector,缓存,方法返回,否则 转发这个selector,否则 报错,抛出异常 从上面的分析我们可以看到,当一个方法在比较“上层”,用比较“下层”(继承关系上上下层)对象去调用时候...,使用 class_copyPropertyList 函数只能获取类属性,而包含成员变量。...方法隐藏参数 我们经常在方法中使用 self 关键字来引用实例本身,但从没有想过为什么 self 就能取到调用当前方法对象吧。

    1.2K20

    MessageMock : 优雅模拟 Objective-C 方法

    参数检查回调,只需要在before_msgSend函数里面挨着调用一下外部传入函数指针。...首先MethodMatcher *指针访问安全使用一个互斥锁就行了,关键是 MessageMock 有两个重要能力是修改返回值和入参,当这些自定义返回值是 Objective-C 对象时,代码里面直接通过汇编指令操作...,编译器不能在合适地方插入retain,那这些 Objective-C 对象就可能提前释放(比如当前作用域结束)。...由于这些对象都是依附于MethodMatcher *存在,所以这些引用计数被加一 Objective-C 对象释放,那MethodMatcher *也不能释放。...上层使用考虑 而考虑到上层接口是在 Objective-C 环境运行,若一个作用域还未结束,这个MethodMatcher *就被释放了就会 Crash,所以上层接口层面是这样设计: @implementation

    84420

    RAC(ReactiveCocoa)介绍(七)——信号销毁

    ( )代码是Objective-C与C语言进行桥接方法,使用__bridge_retained方法自行管理内存。...__bridge_retained将Objective-C转换成C语言,OC对象将所有权交给CF对象,但会解除自动管理内存机制ARC所有权,意味着要自行进行内存管理。...__bridge_transfer内部方法 此处为什么将该block转换成C函数?...将Objective-C对象转换成C函数,而C函数可以直接拿到相应函数指针,拿到函数指针之后就可以指向任意类型,即重定向指针。此处重定向指针之后,会在dispose方法进行指针处理。...因为持有该销毁信号对象是当前类,在RAC信号销毁过程内部方法无法对其进行销毁操作,最终会导致内存泄漏问题 ? 销毁信号使用成员变量而非临时变量,导致内存泄漏

    2.1K20

    基础篇-ObjectC继承、类别、属性

    Objective-C,给一个类扩展一个其它方法,有两种实现方式:类别和继承。 ----  继承  这个是面向对象语言都有的一个特性,子类会继承父类方法和属性以及成员变量。 ...; @protected 保护成员,只有当前类或子类可以访问(如果没有添加任何修饰则默认为@protected); @public 公共成员,所有类均可访问; 类别category...对象中有一个isa指针,该指针指向调用该对象类。...atomic    是Objc使用一种线程保护技术,基本上来讲,是防止在写未完成时候被另外一个线程读取,造成数据错误。...weak    weak比assign多了一个功能,当对象消失后自动把指针变成nil,好处不言而喻。弱引用除了决定对象存亡外,其他与强引用相同。

    1.9K10

    iOS 面试策略之语言工具-Objective-C

    不同之处是 strong 复制是多个指针指向同一个地址,而 copy 复制每次会在内存拷贝一份对象指针指向不同地址。...其中所有线程,只有主线程 runloop 是默认启动,main 函数会设置一个 NSRunLoop 对象。...而所谓 block,就是 Objective-C 对于闭包实现。闭包就是没有名字函数,或者理解为指向函数指针。 7.什么是 block?它和代理区别是什么?...block 出栈需要将使用数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者 block 置 nil 后才消除;delegate 只是保存了一个对象指针,直接回调,没有额外消耗。...上面的代码,两个指针指向不同对象,尽管它们值相同。但是 iOS 编译器优化了内存分配,当两个指针指向两个值一样 NSString 时,两者指向同一个内存地址。

    68420

    OC语言Block 续

    对象函数指针定义使用功能都差不多,块对象精髓之处就在于,在块对象可以访问到上下文变量,而函数指针不能。...3)在现实实现,当函数块语法包含自动变量时候,就没必要进行复制值,所以块对象内存区域也会被保存在静态数据区。...有一个函数可以复制块对象到新堆内存,通过使用函数,即使是在函数内部定义对象也能独立于栈被持续使用,此外还有一个函数可以释放不需要对象。...7)在多线程环境下(blockweakSelf有可能被析构情况下),需要先将self转为strong指针,避免在运行到某个关键步骤时self对象被析构。...第四、五、六行,如果转成strongSelf而使用weakSelf,后面几句话,有可能在第四句执行之后self对象可能被析构掉,然后后面的StausBlock没有执行,导致逻辑错误。

    564120

    编码篇-Block里面的小天地

    下图是block数据结构定义,显而易见,在Block_layout里,我们看到了isa指针为什么说block是对象呢,原因就在于isa指针,在objective-c语言内部,每一个对象都有一个isa...我们可以这样理解,我们通过这个Block变量名称来获取Block指针,然后通过这个指针就可以来使用Block函数。...typedef void(^Blo)(NSString *s1,UIColor *c); 逆向传值 前面我们已经知道Blcok是一个匿名函数,同时也是一个指针,那么使用Block就可以弥补在iOS函数传递功能...block代码是内联,效率高于函数调用 block对于外部变量默认是只读属性 block被Objective-C看成是对象处理 小结 后续会持续更新 本文参考文章 深入浅出-iOS Block原理和内存位置...唐巧-谈Objective-C block实现 深究Block实现 Objective-CBlock

    62520

    OC语言Block 续

    对象函数指针定义使用功能都差不多,块对象精髓之处就在于,在块对象可以访问到上下文变量,而函数指针不能。...3)在现实实现,当函数块语法包含自动变量时候,就没必要进行复制值,所以块对象内存区域也会被保存在静态数据区。...有一个函数可以复制块对象到新堆内存,通过使用函数,即使是在函数内部定义对象也能独立于栈被持续使用,此外还有一个函数可以释放不需要对象。...7)在多线程环境下(blockweakSelf有可能被析构情况下),需要先将self转为strong指针,避免在运行到某个关键步骤时self对象被析构。...第四、五、六行,如果转成strongSelf而使用weakSelf,后面几句话,有可能在第四句执行之后self对象可能被析构掉,然后后面的StausBlock没有执行,导致逻辑错误。

    47490

    iOS - 老生常谈内存管理(三):ARC 面世

    比如,我们经常会在开发中使用到NSError打印错误信息,我们通常会在方法参数传递NSError对象指针。...在《从 MRC 说起 —— 你持有通过引用返回对象》章节也说到,Cocoa 一些方法指定通过引用返回对象(即,它们采用ClassName **或id *类型参数),常见就是使用NSError...,将 CGColorRef(又称 struct CGColor *)作为 id 类型参数传入 使用桥接转换函数参数 当在函数调用Objective-C和Core Foundation对象之间进行转换时...但是赋值以及使用附有__weak修饰符变量都必须恰当地使用 objc4 运行时库函数,因此独自实现引用计数机制类大多不支持__weak修饰符。...OS X Mountain Lion v10.8 推荐使用GC机制,并且将在 OS X 未来版本删除GC机制。ARC是推荐替代技术。

    2.1K10

    【C++】继承 ⑥ ( 继承构造函数和析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

    地方 , 都可以使用 " 公有继承 " 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外 所有 成员变量 和 成员方法 ; 功能完整性 :..." 公有继承 " 派生类 ( 子类 ) 本质上 具有 基类 ( 父类 ) 完整功能 , 使用 基类 可以解决问题 , 使用 公有继承派生类 都能解决 ; 特别注意 : " 保护继承 " 和..." 私有继承 " 派生类 , 是 不具有 基类 完整功能 , 因为 最终继承 后派生类 , 无法在 类外部调用 父类 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则..." 应用场景 : 直接使用 : 使用 子类对象 作为 父类对象 使用 ; 赋值 : 将 子类对象 赋值给 父类对象 ; 初始化 : 使用 子类对象 为 父类对象 初始化 ; 指针 : 父类指针 指向...// 将指向子类对象指针传给接收父类指针函数 // 也是可以 fun_pointer(p_parent); // 接收父类引用参数 fun_reference(*

    28420
    领券