id、NSObject *、id<NSObject>、instancetype

1. id 与 NSObject *

(1) id 是 Objective-C 对象,但是并不一定是NSObject对象,并非所有的Foundation/Cocoa对象都是继承于NSObject对象的,比如NSProxy。同时,id与NSObject对象之间有很多的共同方法,比如retain与release等方法。更一步来说:所有的对象本质来说都是 id 类型的。

(2) 对于id来说,你可以调用任意可见的selector,编译器和IDE不会进行类型检查,这个时候就需要你自己进行类型检查并且进行类型转换,来确保这些调用不会出错。而对于NSObject *类型,只能调用NSObject对象所声明的selector,不能调用它子类的selector,编译器会进行检查。

(3) 对于一些不想或者不能进行类型检查的地方,可以使用id。比如在集合(array, collection)类型中,比如在一些你并不知道方法的返回类型的地方(比如alloc),比如我们经常声明delegate为id类型,在运行的时候再使用respondToSelector:来进行检查。

2. id<NSObject>

使用id<NSObject>来声明一个对象,相当于告诉编译我们并不知道这个对象的类型,但是它实现NSObject protocol。一个这种类型的指针,即可以用来指向NSObject*对象,也可以用来指向NSProxy*对象,因为NSObject对象与NSProxy对象都是现了NSObject protocol。

3. id 与 instancetype

在instancetype有效的情况下,应该尽量去使用instancetype。至于什么是合适的时候,可以参考stack overflow上面所说:“Use instancetype whenever it‘s appropriate, which is whenever a class returns an instance of that same class.”,http://stackoverflow.com/questions/8972221/would-it-be-beneficial-to-begin-using-instancetype-instead-of-id/14652187#14652187

Apple官方文档:

In your code, replace occurrences of id as a return value with instancetype where appropriate. This is typically the case for init methods and class factory methods. Even though the compiler automatically converts methods that begin with “alloc,” “init,” or “new” and have a return type of id to return instancetype, it doesn’t convert other methods. Objective-C convention is to write instancetype explicitly for all methods.

Emphasis mine. Source: Adopting Modern Objective-C

参考资料

时间: 2024-11-13 05:54:14

id、NSObject *、id<NSObject>、instancetype的相关文章

交换机应用之端口模式(access、trunk和hybird)、是否标记(tag、untag)、端口缺省vlan(pvid、native id)

一.概述 打不打标记Tag,untag以及交换机的各种端口模式是网络工程技术人员调试交换机时接触最多的概念了.标记tag就是指VLAN的标签,数据包属于哪个VLAN的.交换机三种端口模式Access vlan.Trunk vlan和Hybrid vlan三种,即以太网端口有三种链路类型:Access.Hybrid和Trunk.在Trunk和Hybird模式下,存在端口缺省vlan的概念(pvid.native vlan id). 二.打不打标记(Tag,untag) tag是指vlan的标签,即

Request.QueryString[&quot;id&quot;] 、Request.Params[&quot;id&quot;] 的强大

<form> <input type="text" name="id" value="值"> </form> //也就是表单提交我们常用的: Request.Form["id"] // 获取窗体变量集合 //js提交呢(例如:”Add.aspx?id=值“),我们用 Request.QueryString["id"] //获取 HTTP 查询字符串变量集合 //还有一种更

Jquery取得iframe中元素的几种方法Javascript Jquery获取Iframe的元素、内容或者ID

query取得iframe中元素的几种方法 在iframe子页面获取父页面元素代码如下: $('#objId', parent.document);// 搞定... 在父页面 获取iframe子页面的元素代码如下: $("#objid",document.frames('iframename').document) 显示iframe中body元素的内容. $(document.getElementById('iframeId').contentWindow.document.body)

linux 查看当前用户id、whoami用户列表、用户组、用户权限/etc/passwd、/etc/group、/etc/shadow以及切换用户身份、su、sudo、/etc/sudoers

一.查看当前用户之id.whoami 命 令:id 功能说明:查看显示目前登陆账户的uid和gid及所属分组及用户名 语 法:id [-gGnru][--help][--version][用户名称] 补充说明:id会显示用户以及所属群组的实际与有效ID.若两个ID相同,则仅显示实际ID.若仅指定用户名称,则显示目前用户的ID. 这个命令在溢出时经常用到,查看是不是溢出root成功,执行一下id命令,显示uid=0,则成功了. 参 数: -g或--group 显示用户所属群组的ID. -G或--g

进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端

摘要:本文主要介绍进程的基本属性,基本属性包括:进程ID.父进程ID.进程组ID.会话和控制终端. 进程基本属性 1.进程ID(PID) 函数定义: #include <sys/types.h> #include <unistd.h> pid_t getpid(void); 函数说明: 每个进程都有一个非负整型表示的唯一进程ID(PID).好比如我们的身份证一样,每个人的身份证号是唯一的.因为进程ID标示符总是唯一的,常将其用来做其他标示符的一部分以保证其唯一性,进程ID(PID)

APUE学习笔记——8.11 实际用户ID、有效用户ID、设置用户ID

用户ID的基本概念 在Unix系统中,很多操作涉及到权限问题,这些权限涉及到用户ID和组ID的概念. 组ID和用户ID的原理和相关内容是类似的.下面介绍用户ID. 我们常见见到三种关于用户ID的概念. 实际用户ID:real user ID      (RUID) 有效用户ID:effective user ID    (EUID) 设置用户ID:saved set-user ID    (SUID) 这三个ID实际上都是针对进程而言的. 实际用户ID 标识进程的执行者.可以看做是我们登录的ID

HX125U-BT低频蓝牙RFID读卡器|ID卡采集器支持安卓、苹果手机即联即用

HX125RU-BT低频蓝牙RFID读卡器是华翔天诚科技研究的一款支持125KHZ低频RFID芯片卡UID数据读取,采用蓝牙4.0与USB双通讯模式.支持安卓.苹果.Windows系统下工作,具有蓝牙即联即用.USB即插即用的特点,可直接类键盘口输出,在光标停留的文本框.记事本.Eexce.Word文档等直接输出RFID卡卡号.HX125RU-BT低频蓝牙RFID读卡器无需二次开发.支持自动刷卡与手动按键刷卡双模式,我司也可根据用户的实际需求,定制不同数据输出格式. HX125RU-BT低频蓝牙

我爱java系列之---【分布式ID生成解决方案:UUID、Redis生成id、snowflake】

唯一id生成方案: a. 使用UUID生成唯一主键: 优点: 全局唯一. 缺点: 因为生成的内容是字符串, 不能排序, 不能按照时间先后排序,因为生成的是字符串类型的id, 可读性差. b. 使用redis来生成全局唯一主键: 优点: redis是内存操作, 速度快, 生成的是数字, 可读性好, 并且可以按照生成的时间先后排序. 缺点: 如果整个系统没有用到redis技术, 那么这里使用redis会增加系统的技术复杂度.   应用服务器到redis服务器获取唯一id, 增加网络io. c. sn

【2017-03-31】JS-DOM操作:操作属性、彩虹导航栏、定时器、操作内容、创建元素并添加、操作相关元素

一.操作属性 1.什么是属性: <div class="div" id="div1" style="" ></div> 其中class   id   style   都是这个div的属性 <input type="button" value="这是一个按钮" disabled="disabled"  aa="haha" /> dis

003-文本处理、排序、统计及bash特性、用户组权限、用户管理配置文件

l  1.文本处理命令 1.)cat(concatenate):连接并显示 tac:倒序显示文件 -n(number):显示行号 -E(show-ends):显示行结束符 2.)more.less:分屏显示 more: 向后翻,翻到尾部退出 less: 与打开man使用相同 3.)head:查看前n行 Tail:查看后n行 -n(lines):指定显示n行 tail -f: 查看文件尾部,不退出,等待显示后续追加至此文件的新内容: 4.)cut:文本剪切 -d(delimiter):指定字段分隔