我们常常会混淆下面三种申明(我是没有留意过):     1. id foo1;     2. NSObject *foo2;     3. id<NSObject> foo3;     第一种是最经常使用的,它简单地申明了指向对象的指针,没有给编译器不论什么类型信息,因此,编译器不会做类型检查.但也由于是这样,你能够发送不论什么信息给id类型的对象.这就是为什么+alloc返回id类型,但调用[[Foo alloc] init]不会产生编译错误.     因此,id类型是执行时的动态类型,编译…
1.id和instancetype都能省去具体类型,提高代码的通用性.而NSObject *则没有这种功能. 2.instancetype只能用于方法的返回类型,而id用处和NSObject *类似. 3.instancetype会告诉编译器当前的类型,这点和NSObject *类似,但id对于编译器却是无类型的,调用任何方法不会给出错误提示. 4.对于init方法,id和instancetype是没有区别的.因为编译器会把id优化成instancetype.当明确返回的类型就是当前Class时…
  在使用Objective-C语言进行iOS应用开发的时候,常常会涉及到id.NSObject *.id.instancetype这四个概念的使用,但这四者也是iOS初学者最易混淆的内容,下面小编看了一些iOS开发教程和文档,搜罗了他们的不同用法,分享给大家,一起来看看吧. 1. id与NSObject * (1)id是Objective-C对象,但是并不一定是NSObject对象,并非所有的Foundation/Cocoa对象都是继承于NSObject对象的,比如NSProxy.同时,id与…
转自:http://blog.csdn.net/happytengfei/article/details/11473931 我们经常会混淆以下三种申明(我是没有留意过):    1. id foo1;    2. NSObject *foo2;    3. id<NSObject> foo3; 第一种是最常用的,它简单地申明了指向对象的指针,没有给编译器任何类型信息,因此,编译器不会做类型检查.但也因为是这样,你可以发送任何信息给id类型的对象.这就是为什么+alloc返回id类型,但调用[[…
1. id 与 NSObject * (1) id 是 Objective-C 对象,但是并不一定是NSObject对象,并非所有的Foundation/Cocoa对象都是继承于NSObject对象的,比如NSProxy.同时,id与NSObject对象之间有很多的共同方法,比如retain与release等方法.更一步来说:所有的对象本质来说都是 id 类型的. (2) 对于id来说,你可以调用任意可见的selector,编译器和IDE不会进行类型检查,这个时候就需要你自己进行类型检查并且进行…
[转载请注明出处] 1.接口的实现 对于接口这一概念的支持,不同语言的实现形式不同.Java中,由于不支持多重继承,因此提供了一个Interface关键词.而在C++中,通常是通过定义抽象基类的方式来实现接口定义的. Objective-C既不支持多重继承,也没有使用Interface关键词作为接口的实现(Interface作为类的声明来使用),而是通过抽象基类和协议(protocol)来共同实现接口的. 2.接口的意义 面向对象编程中一条重要的经验法则是:对接口编程,而不是对实现编程.即一个对…
id 被成为万能指针,也就是可以指向任何对象. NSObject * 本身就是定义指向NSObject类型的指针. 那么这两者有什么区别吗? 这两者都是既可以作为返回值,又可以作为变量修饰.而其主要区别则在于id修饰的变量不遵循<NSObject>协议.这在实现代理模式中会体现出其区别,例如在调用代理方法时会先判断该代理是否能够响应某个方法  [obj respondsToSelector:]就定义在NSObject协议中. 那么,苹果后来为什么有使用instancType呢? 我觉得主要原因…
   为了方便表示或是指定一个组件的名称,我们一般会使用id或者itemId进行标识命名. (推荐尽量使用itemId.这样能够降低页面唯一标识而产生的冲突) id:   id是作为整个页面的Component的唯一标识,这也意味着在整个页面中仅仅同意有唯一一个名称的id.同一时候这里的Component的id也将变为element中的id,所以假设出现了两个,页面将会出现崩塌变形等等不能够想象的问题. 而作为一个组件是必须有自己的唯一标识(id)的,在没有设置Component的id的时候系统…
NSObject头文件解析 当我们需要自定义类都会创建一个NSObject子类, 比如: #import <Foundation/Foundation.h> @interface ClassA : NSObject @end 那么NSObject里面具体有什么呢? 我们点到它的头文件里面去看看 @interface NSObject <NSObject> { Class isa OBJC_ISA_AVAILABILITY; //每个NSObject对象都拥有一个Class类作为成员…
接下来我们继续向下看 typedef struct { void *modelMeta; ///< _YYModelMeta void *model; ///< id (self) void *dictionary; ///< NSDictionary (json) } ModelSetContext; 这是一个c的结构体,在c中 void * 相当于 oc 中的 id 类型 那么 为什么使用c的结构体呢,最主要的使用场景就是我们需要同时使用多个参数的情况下,可以使用c的结构体 /**…
本文主要转载自:ios开发 之 NSObject详解 NSObject是大部分Objective-C类继承体系的根类.这个类遵循NSObject协议,提供了一些通用的方法,对象通过继承NSObject,可以从其中继承访问运行时的接口,并让对象具备Objective-C对象的基本能力.下面我们就详细的介绍NSObject. 1.加载及初始化类 /** 运行时加载类或分类调用该方法, 每个类只会调用一次 */ + (void)load { } /** 类实例化使用前需要先初始化, 一个类调用一次,…
NSObject是大部分Objective-C类继承体系的根类.这个类遵循NSObject协议,提供了一些通用的方法,对象通过继承NSObject,可以从其中继承访问运行时的接口,并让对象具备Objective-C对象的基本能力.下面我们就详细的介绍NSObject. 一.使用详解 1.加载及初始化类 /** 运行时加载类或分类调用该方法, 每个类只会调用一次 */ + (void)load { } /** 类实例化使用前需要先初始化, 一个类调用一次, 如果子类没有实现该方法则会调用父类方法…
前面一章我们整理了NSObject类,这一章我们来看看NSObject协议的内容. NSObject协议提供了一组方法作为Objective-C对象的基础.其实我们对照一个NSObject类和NSObject协议,可以看到很多方法的方法名都是一样的,只不过NSObject类提供的是类方法,是基于类级别的操作:而NSObject协议提供的是实例方法,是基于实例对象级别的操作. 如果一个对象如果采用了这个协议,则可以被看作是一级对象.我们可以从这个对象获取以下信息: 类信息,以及类所在的继承体系.…
首先,我们都知道NSObject是大多数类的根类,但是,这个类的是怎么实现的呢?我们可以去下载开源的Runtime源码,探究下NSObject类的实现. 1. NSObject.h文件 我们可以直接使用Command点NSOject进去看到它的头文件,可以看到,NSObject.h文件中有两块内容: NSObject 协议 NSObject 实现 1.1 NSObject 协议 @protocol NSObject - (BOOL)isEqual:(id)object; @property (r…
如何NSObject和反射 NSObject 常用方法 如何判断 某个对象是否属于某个类或子类 -(BOOL)isKindOfClass:(Class)aClass 判断是否为aClass的实例(不包括aClass的子类) -(BOOl)isMemberOfClass:(Class)aClass 判断是否实现了aProtocol协议 -(BOOL)conformToProtocol:(Protocol)aProtocol 判断这个类的对象是否拥有参数提供的方法 +(BOOL)instancesR…
这篇文章围绕的对象就是NSObject.h文件,对声明文件中的属性.方法进行必要的“翻译”. 该文件大致由两部分组成:NSObject协议和NSObject类. (一)NSObject协议 - (BOOL)isEqual:(id)object; //这个方法的作用是判断两个对象是否相等. //两个对象是否相等不能简单地用“==”判断.基本数据类型用“==”可以判断,如果用在对象身上,只能判断这两个对象的地址是否相等. //对象是否相等的判断是比较复杂的,具体的类判断的方式还不一样.但是这个方法的…
前一篇文章讲到了OC中的代理模式,而且前几篇文章就介绍了OC中的类相关知识,从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套api,和Java中的一些系统jar很相似,又早起的一批人开发的,内部有很多现有的类和功能提供给我们使用.那么今天首先来介绍一下Foundation框架中的第一个类NSObject. 在之前介绍了类的相关知识,我们看到我们自定义的类都必须实现NSObject类,这个类内部有很多现有的方法可以供我们使用…
从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套api,和Java中的一些系统jar很相似,又早起的一批人开发的,内部有很多现有的类和功能提供给我们使用.那么今天首先来介绍一下Foundation框架中的第一个类NSObject 在之前介绍了类的相关知识,我们看到我们自定义的类都必须实现NSObject类,这个类内部有很多现有的方法可以供我们使用,比如我们经常使用的alloc和init方法,就是NSObject提供的,下面…
前些时间在源码里看到instancetype返回类型,一脸惊异,表示接触iOS不久没见过这东西,但发现跟id功能差不多.故查了一些资料,了解了两者之间的区别,故将资料简单翻译整理了一下,为博客充一个数 : ) 转载保留原链接哦原文地址 id类型 id数据类型可以存储任何类型的对象.可以说,它是一般对象类型. 例如可以声明一个为id类型的变量: id graphicObject 也可声明方法使其具有id类型的返回值: - (id)newObject:(int)type; id类型是Objectiv…
new方法实现原理: new做了三件事情 1.开辟存储空间  + alloc 方法 2.初始化所有的属性(成员变量) - init 方法 3.返回对象的地址 [Person new]; == [[Person alloc] init]; alloc: 1.开辟存储空间 2.将所有的属性设置为0 3.返回当前实例对象的地址 init:  1.初始化成员变量, 但是默认情况下init的实现是什么都没有做 2.返回初始化后的实例对象地址 注意: alloc返回的地址, 和init返回的地址是同一个地址…
 id id是指向Objective-C对象的指针,等价于C语言中的void*,可以映射任何对象指针指向他,或者映射它指向其他的对象.常见的id类型就是类的delegate属性. SEL SEL类型是Objective-C用来定义方法的关键字,但却从不属于任何类实例,其值是通过@selector进行计算,可以把她当做一个函数指针来使用,但实际上的类型是const char*.SEL类系可以在编译时通过@selector()直接创建,也可以用NSSelectorFromString()函数创建,这…
Objective-C中的instancetype和id关键字 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/16994913 一.什么是instancetype instancetype 是clang3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的对象可以用id关键字表示,那为什么还会有一个instancetype呢? 二.关联返回类型(related result typeset) 根据Coc…
静态数据类型 默认情况下所有的数据类型都是静态数据类型 静态数据类型的特点: 1 在编译时就知道变量的类型 2 知道变量中有哪些属性和方法 3 在编译的时候就可以访问这些属性和方法 4 并且如果是通过静态数据类型定义变量,如果访问了不属于静态数据类型的属性和方法,那么编译器就会报错 动态数据类型 id 是一个动态数据类型 动态数据类型的特点 1 在编译的时候编译器并不知道变量的真实类型,只有在运行的时候才知道它的真实类型 2 并且如果通过动态数据类型定义变量,如果访问了不属于动态类型的属性和方法…
2014-07-07更新:苹果在iOS 8中全面使用instancetype代替id Steven Fisher:只要一个类返回自身的实例,用instancetype就有好处. @interface Foo:NSObject - (id)initWithBar:(NSInteger)bar; // initializer + (id)fooWithBar:(NSInteger)bar; // convenience constructor @end 对于简易构造函数(convenience co…
目录(?)[-] 有一个相同两个不同相同 Written by Mattt Thompson on Dec 10th 2012 一什么是instancetype 二关联返回类型related result types 三instancetype作用 作用 好处 四instancetype和id的异同 相同点 不同点   有一个相同两个不同.相同 Written by Mattt Thompson on Dec 10th, 2012 Objective-C is a rapidly evolvin…
http://blog.csdn.net/chinahaerbin/article/details/9471419 /* * ARC有效时三种类型转换: */ 1.__bridge          // 转换 2.__bridge_retained // 转换 3.__bridge_transfer // 转换 // __bridge 转换 ////////////////////// // ARC无效时 对应的代码 id obj = [[NSObject alloc] init]; void…
什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和void *pUserName,[userName print] 是可以的,但[pUserName print] 在编译时就会报错,因为ObjeciveC的编译器看到id,会假定它可以接受任何message,虽然在runtime时可能并不是这样的,但pUserName并不是Objective C类型,编…
有一个相同两个不同.相同 Written by Mattt Thompson on Dec 10th, Objective-C is a rapidly evolving language, in a way that you just don't see in established programming languages. ARC, object literals, subscripting, blocks: in the span of just three years, so muc…
原文:http://blog.csdn.net/wzzvictory/article/details/16994913 一.什么是instancetype instancetype是clang 3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的Objective-C对象.我们都知道未知类型的的对象可以用id关键字表示,那为什么还会再有一个instancetype呢? 二.关联返回类型(related result types) 根据Cocoa的命名规则,满足下述规则的方法: 1…
instancetype.id.NSObject的区别 - simalone   1.instancetype只能用于方法的返回类型,而id用处和NSObject *类似. 2.instancetype 和  NSObject *  会告诉编译器当前的类型,但id对于编译器却是无类型的,调用任何方法不会给出错误提示. 3.对于init方法,id和instancetype是没有区别的.因为编译器会把id优化成instancetype.当明确返回的类型就是当前Class时,使用instancetyp…