IOS_OC_id ,NSObject, idlt;NSObjectgt;差别

我们常常会混淆下面三种申明(我是没有留意过):
    1. id foo1;
    2. NSObject *foo2;
    3. id<NSObject> foo3;

    第一种是最经常使用的,它简单地申明了指向对象的指针,没有给编译器不论什么类型信息,因此,编译器不会做类型检查。但也由于是这样,你能够发送不论什么信息给id类型的对象。这就是为什么+alloc返回id类型,但调用[[Foo alloc] init]不会产生编译错误。

    因此,id类型是执行时的动态类型,编译器无法知道它的真实类型,即使你发送一个id类型没有的方法,也不会产生编译警告。

    我们知道,id类型是一个Objective-C对象,但并非都指向继承自NSOjbect的对象,即使这个类型和NSObject对象有非常多共同的方法,像retain和release。要让编译器知道这个类继承自NSObject,一种解决的方法就是像第2种那样,使用NSObject静态类型,当你发送NSObject没有的方法,像length或者count时,编译器就会给出警告。这也意味着,你能够安全地使用像retain,release,description这些方法。

    因此,申明一个通用的NSObject对象指针和你在其他语言里做的类似,像java,但其他语言有一定的限制,没有像Objective-C这样灵活。并非全部的Foundation/Cocoa对象都继承息NSObject,比方NSProxy就不从NSObject继承,所以你无法使用NSObject*指向这个对象,即使NSProxy对象有release和retain这种通用方法。为了解决问题,这时候,你就须要一个指向拥有NSObject方法对象的指针,这就是第3种申明的使用情景。

    id告诉编译器,你不关心对象是什么类型,但它必须遵守NSObject协议(protocol),编译器就能保证全部赋值给id类型的对象都遵守NSObject协议(protocol)。这种指针能够指向不论什么NSObject对象,由于NSObject对象遵守NSObject协议(protocol),并且,它也能够用来保存NSProxy对象,由于它也遵守NSObject协议(protocol)。这是很强大,方便且灵活,你不用关心对象是什么类型,而仅仅关心它实现了哪些方法。

    如今你知道你要用什么类型了不?

    假设你不须要不论什么的类型检查,使用id,它常常作为返回类型,也常常常使用于申明代理(delegate)类型。由于代理类型通常在执行时,才会检查是否实现了那些方法。

    假设真的须要编译器检查,那你就考虑使用第2种或者第3种。非常少看到NSObject*能正常执行,但id无法正常执行的。使用协议(protocol)的长处是,它能指向NSProxy对象,而更经常使用的情况是,你仅仅想知道某个对象遵守了哪个协议,而不用关心它是什么类型。

转载于:https://www.cnblogs.com/bhlsheji/p/4236368.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python移动端web开发代码_移动web前端开发,前端开发工作总结,移动端页面开发-我主页-一个前端程序猿的博客...

热门推荐html/css一、escape和它们不是同一类简单来说&#xff0c;escape是对字符串(string)进行编码(而另外两种是对URL)&#xff0c;作用是让它们在所有电脑上可读。编码之后的...标签&#xff1a;03-22html/css场景&#xff1a; 在项目开发过t程中需要找到url中某个参数的值…

tablednd保存 php,JQuery-tableDnD 拖拽的基本使用介绍

在页面上导入js复制代码 代码如下:jquery-1.3.2.min.jsjquery.tablednd_0_5.js注意&#xff1a;一定要先导入jquery-1.3.2.min.js 否则出错。建table复制代码 代码如下:1Onesome text2Twosome text3Threesome text4Foursome text5Fivesome text6Sixsome text插入js代码复制代码…

移动端页面0.5px border的实现

移动端上经常发现1px边框异常的粗&#xff0c;因此&#xff0c;决定用伪类配合css3来实现0.5px边框 代码如下&#xff1a; 1 <!doctype html>2 <html lang"en">3 <head>4 <meta content"widthdevice-width, initial-scale1.0, maximum-sc…

python 漂亮界面demo_在这个什么都看脸的时代,如何用 GUI 提高 python 程序的颜值?...

0、前言有不少初学者会问&#xff0c;Python 写的程序看起来好丑啊&#xff0c;只能在那个黑黑的框里运行吗&#xff1f;隔壁家的 JS 好像挺好看的&#xff0c;还能有酷炫效果呢……其实呢&#xff0c;术业有专攻&#xff0c;Python 擅长的领域在后台服务器、数据处理、科学计算…

mysql5.3开发文件,cent0s 5.3该下载哪个版本的 mysql安装文件比较合适

我当前的linux是cent0s 5.3请问应该下载哪个版本的 mysql安装文件比较合适&#xff1f;&#xff1f;* Windows* Windows x64* Linux (non RPM packages)* Linux (non RPM, Intel C/C compiled, glibc-2.3)* Red Hat Enterprise Linux 3 RPM (x86)* Red Hat Enterprise Linux 3 …

【LeetCode】Minimum Depth of Binary Tree 二叉树的最小深度 java

【LeetCode】Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node. 递归和非递归&#xff0c;此提比较简单。广度优先遍历即可。…

pythonopencv的配置_python配置与使用OpenCV

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

php中datetime,珍藏 PHP中DateTime的常用方法

前言实例化对象前面加\表示的是&#xff0c;在命名空间中使用原生的类&#xff0c;如果没有使用命名空间的话&#xff0c;可以把前面的\给删除掉输出当前时间$datetime new \DateTime;print_r($datetime->format(Y-m-d H:i:s));输出给定的时间$datetime new \DateTime(201…

php 实现跨站下载图片,一个图片url访问后直接下载怎样实现

一个图片url访问后直接下载怎样实现先看代码downloadIamge(imgsrc, name) {//下载图片地址和图片名let image new Image();// 解决跨域 Canvas 污染问题image.setAttribute("crossOrigin", "anonymous");image.onload function() {let canvas document.…

【BZOJ】【1086】 【SCOI2005】王室联邦

树分块 orz vfk && PoPoQQQ http://vfleaking.blog.163.com/blog/static/174807634201231684436977/http://blog.csdn.net/popoqqq/article/details/42772237 这题是要把树分成一块一块的……&#xff08;感觉好像不是原来理解的树分块处理操作啊……&#xff09; 每块…

matlab火焰测温源程序,一种火焰测温方法与流程

本发明涉及一种测量火焰温度的方法。背景技术&#xff1a;火焰是气态的且正在发生剧烈氧化反应的燃料及各种中间产物及最终产物的混合物。在煤化工、化工领域&#xff0c;在高温、高压反应器(或气化炉)上&#xff0c;火焰检测器一般安装在气化炉的顶部或者中下部&#xff0c;用…

python spark hadoop_使用Scala或Python列出存储在Hadoop HDFS上的Spark群集中可用的所有文件?...

列出Spark中本地可用的所有文件名的最有效方法是什么&#xff1f;我正在使用Scala API&#xff0c;但是&#xff0c;Python也应该没问题。解决方案import org.apache.hadoop.fs。{FileSystem&#xff0c;FileUtil&#xff0c;Path}import scala.collection.mutable.Stack$ b $ …

asp.net权限控制配置web.config

项目下 有三个文件夹 A,B,C 验正方式是 Forms 验正 我要设置他们的访问权限为, A,匿名可访问 B,普通用户授权后才能访问 C,只允许管理员访问 <configuration> <location path "A "> <system.web> <authorization> <allow users…

oracle排序函数性能,oracle排序函数

rank,dense_rank,row_number&#xff0c;以及分组排名partitionrank:排名会出现并列第n名&#xff0c;它之后的会跳过空出的名次&#xff0c;例如&#xff1a;1,2,2,4dense_rank:排名会出现并列第n名&#xff0c;它之后的名次为n1&#xff0c;例如&#xff1a;1,2,2,3row_numbe…

pythonplotline_带误差条的python绘图线,pythonplotlinewitherrorbar

我们有时候会面临画带有误差的图&#xff0c;大致长成下面这个样子image.png代码为# -*- coding: utf-8 -*-"""Created on Sun Jul 5 21:12:17 2020author: x1c"""import matplotlib.pyplot as pltimport seaborn as snsimport numpy as npsns.s…

php什么是变量6,PHP变量是什么

PHP是一门弱类型语言&#xff0c;本身不严格区分变量的类型。PHP在变量申明的时候不需要指定类型。PHP在程序运行期间可能进行变量类型的隐示转换。 和其他强类型语言一样&#xff0c;程序中也可以进行显示的类型转换。PHP变量可以分为简单类型(int、string、bool)、集合类型(a…

美国只有两样东西要比中国 贵,一个是智慧财产权,一个是人工

美国只有两样东西比中国贵 最近中国一直在热传美国的物价低于中国&#xff0c;特别是生活必需品方面&#xff0c;甚至换算成同一种货币都低于中国。从整体情况来 看&#xff0c;美国人各项消费的支出所占收入的比例要远远低于中国人。有人提出来疑问说&#xff0c;那美国人收入…

红黑树和平衡二叉树的区别_面试题精选红黑树(c/c++版本)

红黑树的使用场景非常广泛&#xff0c;比如nginx中用来管理timer、epoll中用红黑树管理事件块&#xff08;文件描述符&#xff09;、Linux进程调度Completely Fair Scheduler用红黑树管理进程控制块、CSTL中map,set的底层实现全是用的红黑树。掌握红黑树的原理以及使用场景&…

linux 更新软件命令 失败,对linux下软件(库)的更新命令详解

在ubuntu服务器下安装包的时候&#xff0c;经常会用到sudo apt-get install 包名 或 sudo pip install 包名&#xff0c;那么两者有什么区别呢&#xff1f;1.区别pip用来安装来自PyPI(https://www.python.org/)的python所有的依赖包&#xff0c;并且可以选择安装任何在PyPI上已…

查看oracle死锁进程并结束死锁

查看oracle死锁进程并结束死锁 摘自: http://sqcjy111.iteye.com/blog/1183928 查看锁表进程SQL语句1&#xff1a; select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode from v$locked_object lo, dba_objects ao, v$sessio…