iOS - id && Object Messaging 深入讲解

Flutter开发者必看:一份配置搞定Android/iOS双端Firebase FCM推送(含常见坑点) 本文为Flutter开发者提供了一份完整的Firebase FCM推送配置指南,涵盖Android和iOS双平台的详细设置步骤、常见问题解决方案及高级功能实现。重点解析了Firebase Cloud Messaging(FCM)在Flutter项目中的集成方法,帮助开发者高效实现跨平台消息推送功能,提升应用用户互动体验。 阅读详情


(一)关于 id

在Objective-C,object有一个通用类型:id

id anObject;


上面这个定义仅仅只是标明了变量 anObject 是一个object(而不是int,double等基础类型),除此之外提供不了任何关于该object的类型信息(如果要得到该对象的更多信息,就要借助于 isa 指针)。

在C或C++中,函数的返回值默认为int,而在Objective-C中,函数的返回值默认为id

id的定义如下:

typedef struct objc_object {
 Class isa;
} *id;

因此每一个object都有一个isa,用于标明该object属于什么class。Class的定义如下:

typedef struct objc_class *Class;


编译器记录了每一个class的定义信息,runtime system会在运行时根据isa找到这些信息,比如:某个object属于哪个class,或者某个object能不能perform某个selector,或者找到它superclass的名字等。


(二)Object Messaging

1.奇怪的叫法:消息,selector

在C语言中,我们说“调用某个函数”

int a = foo();

在C++中,我们说“某个object调用其某个成员方法”

int a = anObject.methodFunction();

在Object-C中,我们说 “给object发消息”

int a = [receiver message];

实际上,在Object-C中,所有的消息(也就是调用对象的方法)都是在运行时动态绑定的(C语言是编译时就确定好了函数地址)
[receiver message]


编译器会修改成对 objc_msgSend 的调用:

objc_msgSend(receiver, selector)


如果有参数,会是这样:

objc_msgSend(receiver, selector, arg1, arg2, ...)

注意:这个时候在叫法上,已经由 message 转换成 selector 了。

为什么叫 selector 呢?那是因为objc_msgSend会在这时候通过message 的名称,在一个叫做 dispatch table 的表里 选择 该 message 对应的函数地址,找到这个函数地址后,将参数传递给该函数,并将该函数的返回值作为 objc_msgSend 的返回值返回给调用者。所以这里有一个“选择”的意味,于是乎被称作 selector 了。

因为可以继承,所以通过 selector 进行函数搜索时,可能会沿着继承链一直往上找,直到NSObject,如下图(来自apple官方):



当给object发送message后,objc_msgSend 会通过该object的isa指针找到自己的dispatch table,如果没有找到对应的函数地址,会一直沿着继承链往上搜索。


2. Sending Messages to nil

The keyword nil is defined as a null object, an id with a value of 0. (按照 id 的定义,nil 就是一个空指针喽~)

在Object-C中,给nil发message是合法的,且不会产生任何效果。但是对于返回值,还是有一些说法的:

1)如果message的返回值是object类型,那么当receiver为nil 时,返回值也是 nil。

Person *motherInLaw = [[aPerson spouse] mother];

如果 [aPerson spouse] 返回nil,那么 [[aPerson spouse] mother] 返回nil。

2)If the method returns any pointer type, any integer scalar of size less than or equal to sizeof(void*),a float, a double, a long double, or a long long, then a message sent to nil returns 0.

3)If the method returns a struct, as defined by the Mac OS X ABI Function Call Guide to be returned in registers, then a message sent to nil returns 0.0 for every field in the struct. Other struct data types will not be filled with zeros.

4)If the method returns anything other than the aforementioned value types, the return value of a message sent to nil is undefined.

示例:

id anObjectMaybeNil = nil;
// this is valid
if ([anObjectMaybeNil methodThatReturnsADouble] == 0.0)
{
 // implementation continues...
}



前端即时通讯实战:从WebSocket协议到工程化架构设计 即时通讯(IM)是实现实时数据交互的核心技术,其本质是基于长连接的双向通信机制。从技术原理上看,前端实现IM主要依赖WebSocket、Server-Sent Events(SSE)和长轮询等协议,其中WebSocket凭借全双工、低延迟的特性成为现代Web应用的首选。这项技术的工程价值在于将网络协议知识转化为高可用的线上服务,需要系统性地处理连接管理、消息可靠性和状态同步等复杂问题。在实际应用场景中,即时通讯已从在线聊天扩展到协同编辑、实时通知、直播互动等多个领域,对前端开发者的工程化能力提出了更高要求。 阅读详情

相关推荐

MUNI-FI-PA195课程资料包:掌握Firebase与NoSQL技术

本文还有配套的精品资源,点击获取 简介:本资料包可能属于某大学的课程“MUNI-FI-PA195”,涵盖2019至2020学年度。该课程涉及Firebase平台、包括Firebase实时数据库的使用,以及NoSQL数据库的相关知识。课程重点在于教授实时数据库的设计、管理和数据同步技术,以及非关系型数据库设计原理。参与者将通过实践学习到如何构建和开发Web和移动应用,同时掌握...

weixin_34392511的博客 1299

消息队列:第六章:ObjectMessage与MapMessage

javax.jms.jmsexception:无法从内容生成正文。可序列化类不可用于代理原因:java.lang.ClassNotFoundException: 禁止类com.javaliao.portal.model.TbLogVisit不信任将此类序列化为objectMessage负载。 有关如何配置受信任类的详细信息,请查看http://activemq.apache.org/obje...

我是Java程序员廖志伟,感谢朋友们的支持! 2300

西瓜书第二章——模型评估与选择(十折交叉验证/查准查全F1)

第二章——模型评估与选择

xsddys的博客 953

如何快速去除代码前面的序号

按住ALT键,可用鼠标勾划自定义选区,然后Delete

Gushleo的专栏 3954

寒假实训笔记day01——认识M4单片机之STM32F405RGT6

认识M4单片机之STM32F405RGT6(含义、规格、参数)

weixin_47200070的博客 8551

GD32_ADC采样+DMA多通道扫描传输

所使用的MCU 片上集成了 12 位逐次逼近式模数转换器模块(ADC),可以采样来自于 16 个外部通道和 2 个内部通道上的模拟信号。这 18 个 ADC 采样通道都支持多种运行模式,采样转换后,转换结果可以按照最低有效位对齐或最高有效位对齐的方式保存在相应的数据寄存器中。我们主要介绍其多通道扫描转换和DMA传输功能,在多个通道轮询采集ad数据,并使用DMA分别保存各个数据值,其能大大提高ADC的工作效率。以下为ADC 模块框图:

Yin_w的博客 8159

Firebase Cloud Messaging iOS推送通知终极指南

你是否曾经为iOS应用的消息推送功能感到头疼?复杂的配置、繁琐的证书管理、难以调试的问题...这些问题都将在本文中得到完美解决!🔥 作为苹果生态中最常用的推送服务之一,Firebase Cloud Messaging(FCM)为开发者提供了强大而灵活的解决方案。无论你是新手还是经验丰富的开发者,这篇指南都将带你快速掌握FCM的核心精髓。 ## 🚀 快速上手:5分钟完成FCM集成 ###

gitblog_00749的博客 1142

SpringBoot实战——仿b站项目(一)

热部署就是当应用程序这种运行的时候升级冉家或者修改某一部分代码、配置文件时,无需手动启动应用,即可修改的部分生效工具 + IDEA配置。

weixin_52880572的博客 3455

FlutterFire推送通知终极指南:从零到一实现跨平台消息推送

FlutterFire 是 Firebase 官方提供的 Flutter 插件集合,为 Flutter 应用提供完整的 Firebase 服务集成方案。其中 Firebase Cloud Messaging (FCM) 插件让开发者能够轻松实现跨平台的推送通知功能。本文将为您提供完整的 FlutterFire 推送通知配置指南,涵盖 iOS、Android 和 Web 三大平台。 ## 🔥 为

gitblog_01095的博客 965

MacOS下Mixly 2.0安装避坑指南:从Java环境到终端权限全解析

本文详细解析了在MacOS系统上安装Mixly 2.0时可能遇到的核心问题与解决方案。针对Java环境版本不兼容、MacOS Gatekeeper安全机制拦截以及终端权限不足三大常见障碍,提供了从检查并配置正确Java版本、安全设置绕过到彻底解决应用内部工具链权限的完整避坑指南,帮助用户顺利完成安装并正常使用。

weixin_29231725的博客 503

Scipy优化踩坑实录:trust-constr和SLSQP约束定义到底差在哪?

本文深入解析了Scipy优化模块中trust-constr和SLSQP两种方法在约束定义上的差异。通过对比面向对象的trust-constr和字典式定义的SLSQP,揭示了它们各自的优势与适用场景,帮助开发者在有约束优化问题中选择合适的算法,提升计算效率与准确性。

weixin_42573113的博客 270

移动端通知分组优化实战:Android渠道与iOS线程标识符详解

通知推送是移动应用与用户保持连接的核心机制,其本质是一种系统级的消息传递服务。其工作原理是应用通过系统API创建并发送通知,由操作系统统一管理并在状态栏、锁屏或通知中心展示。优化通知管理的技术价值在于提升信息传递效率、降低用户干扰并增强核心功能触达率,这对于改善用户体验和留存至关重要。在应用场景上,智能助手、社交、电商等各类应用都需要对营销、提醒、聊天等不同来源的通知进行精细化分类。本文聚焦于**通知分组**这一关键优化手段,通过对比Android的**通知渠道**与iOS的**线程标识符**机制,提供了跨

weixin_34090562的博客 394

国科大学习资料--模式识别与机器学习(黄庆明)--期末复习题2(含答案)

国科大学习资料–模式识别与机器学习(黄庆明)–期末复习题2(含答案) 国科大学习资料–模式识别与机器学习(黄庆明)–期末复习题2(含答案) 国科大学习资料–模式识别与机器学习(黄庆明)–期末复习题2(含答案) ...

无名何许人的博客 1万+

Unity手游广告变现:Google Mobile Ads插件集成与避坑指南

在移动应用开发中,广告变现是开发者实现应用商业化的重要途径。其核心原理是通过集成广告SDK,在应用界面中请求、加载并展示来自广告平台的广告内容,从而根据展示或用户互动获得收益。这项技术的价值在于为开发者提供了一种可持续的收入模式,尤其适用于免费游戏和应用。在Unity游戏开发领域,Google Mobile Ads插件是实现这一功能的关键工具,它封装了原生平台的复杂性,允许开发者使用C#统一管理AdMob广告。然而,在实际工程实践中,从SDK安装、初始化到各广告格式的集成,常会遇到诸如**线程安全**和**

weixin_30915951的博客 413

高级用法:LangChain 安全防护(Guardrails)

在调用开始时校验请求,可做关键词过滤、身份校验、限流等。= "human":return {}],# 使用],= "human":return {}],

Long_像风一样自由 316

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Streama移动端推送通知终极配置指南:Firebase与APNs实战教程

Streama作为一款强大的自托管流媒体服务器,让你轻松打造个人媒体中心。通过配置移动端推送通知,你可以即时获取新内容上线、播放进度同步等重要信息,让流媒体体验更加流畅便捷。本文将详细介绍如何在Streama中配置Firebase和APNs推送服务,即使是新手也能快速上手。 [![Streama流媒体服务器界面](https://raw.gitcode.com/gh_mirrors/st/str

gitblog_00057的博客 476

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

React Native Firebase 终极实战指南:从零构建企业级移动应用

React Native Firebase 是 React Native 生态中最完善、最专业的 Firebase 集成方案,为开发者提供了在 Android 和 iOS 平台上使用所有 Firebase 服务的完整支持。作为官方推荐的 Firebase React Native 模块集合,它不仅支持 React Native CLI 项目,还能与 Expo 开发构建完美集成,让开发者能够轻松构建

gitblog_00188的博客 401

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

9.4 推送通知

推送通知是 App 召回用户、传递信息的重要手段。Flutter 中推送通知分为本地通知和远程推送两种,通常结合使用。

liuyinghui523的专栏 86

3步掌握React Native Firebase:从零搭建到实战部署的完整指南

React Native Firebase 是官方推荐的 Firebase 服务集合,为 React Native 应用提供完整的 Firebase 支持。无论你是使用 React Native CLI 还是 Expo,这个强大的工具集都能让你轻松集成认证、数据库、分析等 20+ 种 Firebase 服务到你的跨平台应用中。 ## 📋 项目概述:为什么选择 React Native Fire

gitblog_00020的博客 411

google的GCM推送使用简介

转载请注明出处:http://blog.youkuaiyun.com/newhope1106/article/details/54709916GCM即Google Cloud Messaging,主要用于消息推送的,即使在应用没有起来的情况下,客户端也能通过GCM收到来自服务器的消息。GCM支持Android、IOS和Chrome。由于GCM需要google service支持,在国内基本不能用,经常会断线,...

xu13879531489的专栏 1万+

FlutterFire推送通知API密钥:管理Firebase消息凭证

你是否曾因API密钥泄露导致推送服务异常?或因凭证管理混乱错失重要用户通知?本文将系统讲解FlutterFire推送通知API密钥的获取、配置与安全管理,帮你构建稳定可靠的消息推送系统。读完本文你将掌握:多平台凭证配置方法、密钥轮换策略、常见错误排查以及安全最佳实践。 ## 什么是Firebase推送通知API密钥 Firebase推送通知API密钥(Server Key)是应用服务器与Fir...

gitblog_00780的博客 736

Spree推送通知:移动端实时消息推送

在移动电商时代,实时推送通知已成为提升用户体验和转化率的关键技术。Spree Commerce作为一款模块化、API优先的开源电商平台,提供了灵活的推送通知集成方案。本文将深入探讨如何在Spree中实现移动端实时消息推送,涵盖技术架构、实现方案和最佳实践。 ## 推送通知的重要性 ```mermaid mindmap root((推送通知价值)) 用户参与度 ⬇️ 订单...

gitblog_01191的博客 863

从入门到精通:XDM插件开发全指南(附Chrome/Firefox实现案例)

你是否曾想扩展XDM(Xtreme Download Manager)的下载能力?本文将系统讲解插件开发的核心方法,从清单文件配置到消息通信,帮助你打造自定义下载功能。读完本文,你将掌握: - 跨浏览器插件架构设计 - 原生消息通信实现 - 视频下载检测机制 - 上下文菜单与UI交互开发 ## 插件架构概览 XDM插件采用"前端-原生"双层架构,通过浏览器扩展API拦截网络请求,再通过原生消息

gitblog_00827的博客 1038

Android集成华为推送教程

前言 目前Android应用在后台杀死进程之后,就收不到通知了,想要接收消息推送,需要集成各个厂商的推送SDK,本次讲解华为集成最新教程 1.配置AppGallery Connect 1)注册成为开发者 在开发应用前需要在华为开发者联盟网站上注册成为开发者并完成实名认证,具体方法请参见帐号注册认证。注册完之后创建项目和创建应用。 2)生成签名证书指纹 签名证书指纹用于校验应用的真实性,您需要根据签名证书在本地生成签名证书指纹,并在应用上架前将签名证书指纹配置到AppGallery Connect。 官方

中控易动的博客 3401

【愚公系列】《移动端AI应用开发》041-DeepSeek与第三方服务的集成(第三方消息推送与实时通信)

摘要: 本文聚焦 DeepSeek 与第三方服务的高效集成,重点探讨 消息推送与实时通信 的实现方式。通过 Firebase Cloud Messaging (FCM) 和 OneSignal 两大主流推送平台,结合代码示例(如设备注册、消息发送与接收),解析移动端AI应用如何集成实时通知功能。 核心内容: Firebase:集成步骤(依赖配置、令牌获取、消息发送)及Android端实现; OneSignal:跨平台推送服务配置与消息处理机制; 应用场景:支付、社交、地图等服务的实时交互优化,提升用户体验与

愚公智库 6166
上一篇: iOS - self & super 理解的关键点
下一篇: iOS - Concurrency Programming Guide (iOS并行编程指南)
object_c_key
博客等级 码龄11年 0粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值