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

YALMIP介绍及怎么在Matlab中加YALMIP、SDPT3

目录YALMIP简介怎么在Matlab中加YALMIP?1. 创建决策变量:2. 添加约束:3. 参数配置4. 求解怎么在MatlabR2019a中加YALMIP?1.下载工具包2.放置工具包3.添加路径4.测试安装结果怎么在MatlabR2019a中加SDPT3? YALMIP简介 怎么在Matlab中加YALMIP? yalmip是一位“集大成者”,它不仅自己包含基本的线性规划求解算法,比如linprog(线性规划)、bintprog(二值线性规划)、bnb(分支界定算法)等,他还提供了对cpl

m0_51431440的博客 2万+

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

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

Gushleo的专栏 3954

A-Level CS 计算机科学 考试知识点——考试介绍&第1章

前言:该系列文章是本人在给学生辅导本课程的过程中结合英文教材所总结的,该系列共分为30章,主要介绍了考试的核心知识点。若需要A-Level CS 计算机科学考试辅导也可以私信我。 目录 关于A-Level CS 计算机科学考试 考试简介 考试内容 考试时间 评分情况 第1章 信息表示 本章学习内容 1.01 数字系统 1.02 数字的内部编码 整数编码(Coding for integers) 二进制编码的十进制(Binary coded decimal——BCD) 1.03.

王俊的博客 6456

TIBCO Spotfire 入门指南

数据分析工具 - TIBCO Spotfire 入门指南(一) 文章目录数据分析工具 - TIBCO Spotfire 入门指南(一)前言一、Sportfire 是什么?二、使用Sportfire 创建一个简单的数据分析模型1.设置分析(加载数据)2.编辑数据源3.创建图表3.1 创建交叉表3.2 创建饼图3.3 创建树形图3.4 创建散点图3.5 创建自定义筛选器总结 前言 通过对本指南的学习,你可以了解到如何开始用TIBCO Sportfire分析数据,并能详细了解您可以做什么以及怎么做 一、Spo

kaiakai111的博客 1万+

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

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

gitblog_00749的博客 1142

Vivado XDMA仿真实战:从配置到链路训练全解析

本文深入解析了Vivado中XDMA IP核的仿真实战流程,重点剖析了PCIe链路训练状态机(LTSSM)的工作原理与调试方法。通过搭建仿真环境、解读日志与波形,手把手指导如何从配置、链路训练(LTSSM)到BAR映射与DMA启动进行全流程分析与问题定位,帮助工程师掌握核心调试技能,确保PCIe链路稳定与数据传输正确。

weixin_29197051的博客 154

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

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

gitblog_01095的博客 965

别再乱调NvM_WriteBlock了!手把手教你搞懂Autosar NVM状态机与读写时序

本文深入解析Autosar NVM状态机与读写时序,帮助开发者避免常见错误。通过详细的状态机解读、最佳实践代码示例和异常处理策略,提升嵌入式系统中数据存储的可靠性。特别针对NvM_WriteBlock的调用逻辑和状态机机制进行实战讲解,解决工程师在实际开发中遇到的异步写入问题。

weixin_33701617的博客 344

用74LS194和555定时器DIY流水灯:一个经典的数字电路课程设计复盘(附Multisim仿真文件)

本文详细介绍了使用74LS194移位寄存器和555定时器搭建八路彩灯控制器的完整过程,包括硬件选型、电路设计、调试技巧及常见问题解决方案。作为经典的数字电路课程设计,该项目涵盖了EDA工具应用、电路原理图设计和Multisim仿真等核心技能,适合电子工程学习者实践参考。

weixin_29185199的博客 425

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

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

weixin_34090562的博客 394

YOLOv8高级应用实战:多目标跟踪+实例分割+小样本检测(工业/安防场景落地指南)

安防监控中,需要跟踪多个行人的运动轨迹,而不只是框出“这是行人”;工业质检时,要精确分割出零件的缺陷区域(像素级),而不是只给一个粗略的矩形框;罕见场景下(如特殊故障检测、稀有动物识别),只能收集到几十张样本,普通训练方法精度惨不忍睹。我在落地工业安防和质检项目时,把YOLOv8的高级功能摸了个遍,踩过“多目标跟踪遮挡丢帧”“实例分割边缘模糊”“小样本检测过拟合”等一系列坑,最终总结出这套可直接复用的实战方案。多目标跟踪(ByteTrack)、实例分割、小样本检测。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 750

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

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

weixin_30915951的博客 413

【ComfyUI】SDXL + 单LoRA 房屋平面图渲染装修

本文介绍了一种基于ComfyUI的室内平面设计图自动生成效果图的工作流。该流程通过导入房屋平面图,结合SDXL室内设计模型与北欧风格LoRA模块,快速生成多房间效果展示。工作流包含图像输入、文本处理、模型加载和图像生成等环节,支持风格化渲染和细节补充,适用于建筑设计、家装展示、房地产营销等场景。核心采用SDXL通用室内设计模型和北欧极简LoRA,通过节点衔接实现自动化批量生成,能在短时间内将平面方案转化为逼真的三维效果图。该技术可提升设计呈现效率,辅助客户决策,并应用于教学研究领域。

Mr数据杨 3649

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

gitblog_00057的博客 476

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

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

gitblog_00188的博客 401

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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、付费专栏及课程。

余额充值