首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在Objective-C中没有将'id'类型的对象初始化为带有'*'的指针?

在Objective-C中,没有将'id'类型的对象初始化为带有'*'的指针,是因为'id'类型本身就是一个指针类型。'id'类型的变量可以指向任何Objective-C对象,它代表了一个对象的指针,而不是对象本身。

在Objective-C中,'id'类型的对象通常是通过消息传递机制来进行操作的。因此,在使用'id'类型的对象时,不需要显式地使用'*'指针。这种机制使得Objective-C代码更加简洁和易于阅读。

此外,'id'类型的对象可以自动地进行类型检查和转换,这也是Objective-C的一个重要特性。因此,在Objective-C中,我们不需要显式地使用'*'指针来表示对象,而只需要使用'id'类型的变量即可。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Objective-C高级编程》温故知新之Blocks

1、返回值类型 省略返回值类型,如果表达式有 return 语句就使用该返回值类型,如果表达式没有 return 语句就使用 void 类型。...首先, Block 指针赋给 Block 结构体成员变量 isa .为了理解他,首先要理解 Objective-C 类和对象实质。...其实,所谓 Block 就是 Objective-C 对象id 这一变量类型用于存储 Objective-C 对象。... Objective-C 源代码,虽然可以像使用 void *类型那样随意使用 id, 但此 id 类型也能在 C 语言中声明。... Block 作为 Objective-C 对象处理时,关于该类信息放置于 _NSConcreteStackBlock,信息包含成员变量、方法名称、方法实现(即函数指针)、属性以及父类指针

60240

重新回味·Block·

表达式 省略之后: ^ 表达式 通过上面的例子可以看出两点不同: 没有函数名称; 带有“^”符号; Block基本使用 可以通过定义Block类型变量对Block进行调用,与函数指针有相似之处,...void *FuncPtr; }; 其中,有关对象isa指针理解可以参考之前写过文章Objective-C Runtime:深入理解类与对象 第二个成员变量Desc,主要保存block所在内存区域以及...从而得知,Block就是Objective-C对象了。 具体关于Objective-C类与对象知识可以参考另一篇文章深入理解类与对象。...__testBlock_block_impl_0结构体实例指针赋值给变量blk,从而知道源代码Block表达式就是__testBlock_block_impl_0结构体类型变量,同时也是该结构体栈上生成实例...b[] = a; } 从而看出端倪,C语言数组类型变量赋值给C语言数据类型变量,这个C语言下是无法编译,C语言不允许这样编译

62440

深入理解Block

省略之后: ^ 表达式 通过上面的例子可以看出两点不同: 没有函数名称; 带有“^”符号; ---- Block基本使用 可以通过定义Block类型变量对Block进行调用,与函数指针有相似之处...从而得知,Block就是Objective-C对象了。 具体关于Objective-C类与对象知识可以参考另一篇文章深入理解类与对象。...__testBlock_block_impl_0结构体实例指针赋值给变量blk,从而知道源代码Block表达式就是__testBlock_block_impl_0结构体类型变量,同时也是该结构体栈上生成实例...需要在初始化结构体函数添加与局部变量相同类型参数; 3、局部变量就通过初始化构造函数传递到Block结构体__testBlock_block_impl_0,同时赋值给Block成员变量; 4、执行...看到这,你会感到疑惑,上面刚讲到Block是如何截获局部变量为什么到这里就失效了呢? 这是因为,Block没有实现对C语言数组截获。

91110

【C++】继承 ⑥ ( 继承构造函数和析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

" 私有继承 " 派生类 , 是 不具有 基类 完整功能 , 因为 最终继承 后派生类 , 无法 类外部调用 父类 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则..." 应用场景 : 直接使用 : 使用 子类对象 作为 父类对象 使用 ; 赋值 : 子类对象 赋值给 父类对象 ; 初始化 : 使用 子类对象 为 父类对象 初始化 ; 指针 : 父类指针 指向...子类对象 , 父类指针 值为 子类对象 堆内存 地址 , 也就是 子类对象 地址 赋值给 父类类型指针 ; 引用 : 父类引用 引用 子类对象 , 子类对象 赋值给 父类类型引用 ; 二...指向 子类对象 定义 一个子类对象 Child child ; 定义父类指针 , 指针 指向 子类对象 地址 , 这是合法 ; 代码示例 : // 父类对象 Parent parent...child.funChild(); // 子类对象 可以调用 父类公有函数 child.funParent(); // 指向子类对象指针传给接收父类指针函数

20720

Objective-C一些特殊数据类型

Objective-C,有一些我们之前并不熟悉但是经常见到数据类型,比如id、nil、Nil、SEL等等。很多文章里,我们都见过这些数据类型介绍,但是都没有太清楚。...在上面的代码id是指向struct objc_object一个指针,这个意思基本上是说,id是一个指向任何一个继承了Object(或者NSObject)类对象。...需要注意id 是一个指针,所以你使用id时候不需要加星号。比如id foo=nil定义了一个nil指针,这个指针指向NSObject一个任意子类。...而id *foo=nil则定义了一个指针,这个指针指向另一个指针,被指向这个指针指向NSObject一个子类。 nil nil和C语言NULL相同,objc/objc.h定义。...nil表示一个Objctive-C对象,这个对象指针指向空(没有东西就是空)。 Nil 首字母大写Nil和nil有一点不一样,Nil定义一个指向空类(是Class,而不是对象)。

62220

iOS引用转换:Foundation与Core Foundation对象互相转换(__CFString转NSString,void *转id等等)

为什么转换?这是因为获取关联对象API -- objc_getAssociatedObject 里面的参数要求。...所谓Toll-free bridging是说您可以某个框架方法或函数同时使用 Core Foundation 和 Foundation 框架某些类型。...Objective-C指针与CoreFoundation指针之间转换 2.1 MRC下转换 CF-->OC 强制转换符:(CFStringRef) OC-->CF 强制转换符:(NSString...ARC,CF和OC之间转化桥梁是 __bridge,有3种方式: __bridge 只做类型转换,不改变对象所有权,是我们最常用转换符。...,没有进行所有权转移,也就是说,当aNSString对象被ARC释放时候,aCFString也不能被使用了。

2.1K40

Objective-C笔记

Objective-C被描述为盖C语言上薄薄一层, 因为Objective-C原意就是C语言主体上加入面向对象特性。OC项目中常用拓展名如下: 扩展名 内容类型 .h 头文件。...带有这种扩展名源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码。仅在你Objective-C代码确实需要使用C++类或者特性时候才用这种扩展名。...括号接收消息对象左边,消息及其参数右边。...类似于Smalltalk,Objective-C具备动态类型:即消息可以发送给任何对象实体,无论该对象实体公开接口中有没有对应方法。...*) foo; Objective-Cid类型类似于void指针,但是被严格限制只能使用在对象上。

88240

【IOS开发高级系列】Objective-c Runtime专题总结

OC表示类型(Swift是Selector类)。...        Isa指针有两类:     1、oc对象化为c结构体时,用于指向对应Class结构体isa指针;     2、Class结构体内部实现里,isa指针作为一个成员变量,指向该class...3.2 方法隐藏参数         我们经常在方法中使用 self 关键字来引用实例本身,但从没有想过为什么 self就能取到调用当前方法对象吧。...它们是代码被编译时被插入实现。尽管这些参数没有被明确声明,源代码我们仍然可以引用它们。...当一个对象由于没有相应方法实现而无法响应某消息时,运行时系统通过forwardInvocation: 消息通知该对象

30630

iOS工程师必看 20 道 面试题

原因是assign修饰对象被释放后,指针地址依然存在,造成野指针堆上容易造成崩溃。而栈上内存系统会自动处理,不会造成野指针。 copy与strong类似。...闭包就是没有名字函数,或者理解为指向函数指针。 3....Swift ,类是引用类型,结构体是值类型。值类型传递和赋值时进行复制,而引用类型则只会使用引用对象一个"指向"。所以他们两者之间区别就是两个类型区别。...说说Swift为什么String,Array,Dictionary设计成值类型? 要解答这个问题,就要和Objective-C相同数据结构设计进行比较。...Objective-C,字符串,数组,字典,皆被设计为引用类型。 值类型相比引用类型,最大优势在于内存使用高效。值类型栈上操作,引用类型堆上操作。

3.6K40

iOS - 老生常谈内存管理(三):ARC 面世

Objective-C指针类型id和C指针类型void *之间进行转换需要使用Toll-Free Bridging,请参阅《Managing Toll-Free Bridging》章节。...(详情见 Nib Files in Resource Programming Guide) 栈变量初始化为 nil 使用ARC,strong、weak和autoreleasing栈变量现在会默认初始化为...MRC下,我们可以直接在Objective-C指针类型id和C指针类型void *之间进行强制转换,如Foundation对象和Core Foundation对象进行转换。...而在使用__bridgevoid *类型转换为id类型时,一定要注意此时对象内存管理还是由开发者手动管理,记得不需要对象时进行释放,否则内存泄漏!..._Nonnull' // 不兼容指针类型 CGColorRef(又称 struct CGColor *)作为 id 类型参数传入 使用桥接转换函数参数 当在函数调用Objective-C

1.9K10

面经之《招聘一个靠谱iOS》import CYLBlockExecutor.himport CYLBlockExecutor.himport CYLNSObject+RunAtDeallo

setter 与 getter 方法对应实现, setter 方法从偏移量位置开始赋值, getter 方法从偏移量开始取值,为了能够读取正确字节数,系统对象偏移量指针类型进行了类型强转....下面分别介绍下方法内部实现: objc_initWeak函数实现是这样“附有weak修饰符变量(obj1)”初始化为0(nil)后,会将“赋值对象”(obj)作为参数,调用objc_storeWeak... Objective-C 向 nil 发送消息是完全有效——只是在运行时不会有任何作用: 如果一个方法返回值是一个对象,那么发送给nil消息返回0(nil)。...如果方法返回值为指针类型,其指针大小为小于或者等于sizeof(void*),float,double,long double 或者 long long 整型标量,发送给 nil 消息返回0。...objc向一个对象发送消息时,runtime库会根据对象isa指针找到该对象实际所属类,然后该类方法列表以及其父类方法列表寻找方法运行,如果,最顶层父类依然找不到相应方法时,程序在运行时会挂掉并抛出异常

966100

iOS 开发:彻底理解 iOS 内存管理(ARC 篇)

如果两个以上成员变量互相强引用对方,则两个对象永远不会被释放,从而发生内存泄漏。所谓内存泄露就是当废弃对象超出其生存周期后继续存在。...ARC 使用 MRC 时代,我们需要自己调用 retain 方法去持有一个对象,而现在不需要。我们唯一需要做是使用一个指针指向这个对象,只要这个指针没有被置空,对象就会一直保持堆上。...当我们指针指向新对象时,原来对象就会被 release 一次。...用于 OC 对象,相当于 MRC assign assign:用于修饰基本数据类型,跟 MRC assign 一样,不涉及内存管理。...所以 copy 多用于修饰带有可变类型不可变对象上(NSString / NSArray / NSDictionary)。这是为了避免可变类型数据赋值给不可变类型数据时,内容发生改变情况。 8.

52910

利用Clang探究__block本质

当我们Objective-C层面调用block时候,底层就可以通过调用block对应C++结构体对象函数指针来实现同等操作。...那么问题来了,为什么被__block说明符修饰变量就可以block函数体内部访问呢?__block底层究竟对被修饰变量做了什么呢?__block是如何“外部变量”从栈中转移到堆?...结构体__block_impl一样,isa指针将来指向block类型。...Flags被初始化为0。Reserved是保留成员变量,暂时没有实际意义。FuncPtr是一个函数指针,指向block函数体。...等价于int num = 0 而static表示修饰变量作为静态变量存储全局变量区。 static变量有默认初始值0,而auto变量没有默认初始值。

7.3K20

iOS RunTime之二:数据结构

id objc_msgSend方法里面的第一个参数数据类型id,通用类型指针,能够表示任何对象。 ?...Class 从源文件看出,Objective-C对象就是一个包含isa指针数据结构,而isa指针数据类型是Class,Class表示对象所属类。 ?...objc_class结构体定义如下: isa:Objective-C,所有的类自身也是一个对象,即类对象。在这个类对象里面也有一个isa指针,它指向metaClass(元类)。...元类(Meta Class) Objective-C,所有的类自身也是一个对象,这个对象里面也有一个isa指针,它指向metaClass(元类),向这个对象发送消息(即调用类方法)。 ?...当对象receiver调用方法message时,首先根据对象receiverisa指针查找到它对应类,然后methodLists搜索方法,如果没有找到,就使用super_class指针到父类

54720

Objective-C对象模型和runtime机制「建议收藏」

能够objc.h文件里查找到对象结构定义,例如以下所看到对象结构为Class类型isa,而Class是 objc_class结构类型指针。 objc_class即我们理解对象结构。...定义实例对象时候,并不会进行不论什么存储空间(堆)分配,直到调用类方法alloc函数和实例方法init函数实现实例对象结构存储分配。并将isa指向其类对象。...父类成员变量和相应类对象成员变量初始化为0或nil 上述理解能够通过以下代码和对象变量结构分析来进行确认。..., 可通过关键字@selector()获得 id 数据结构第一部分:对象模型已经有定义。...同一时候类还包含指向父类指针)查找; 假设没有class象里找到。再到super_class查找。 假设找到message这种方法,执行它实现IMP 假设找不到消息。

23720

iOS应用开发:什么是ARC

(s1) firstName作为”natsu”字符串对象最初持有者,是该NSString类型对象Strong reference (s2) 这里firstName代入到aName,即aName也成为了...引用关键字 ARC关于对象引用参照,主要有下面几关键字。使用strong, weak, autoreleasing限定变量会被隐式初始化为nil。...由于该类型不影响对象生命周期,所以如果对象之前就没有持有者,那么会出现刚创建就被破弃问题,比如下面的代码。...但是这样,需要注意变量所指对象已经被破弃了,地址还还存在,但内存对象已经没有了。如果还是访问该对象引起「BAD_ACCESS」错误。 __autoreleasing 该关键字使对像延迟释放。....不能在c结构体中使用对象指针,如果有类似功能可以创建一个Objective-c类来管理这些对象         6.id和void *之间没有简便转换方法,同样Objective-c和core

1.1K60

Objective-C Runtime详解

记住,当一个消息发送给任何一个对象, 方法检查 从对象 isa 指针开始,然后是父类。实例方法定义, 类方法 元类和根类定义。(根类元类就是根类自己)。...方法隐藏参数 我们经常在方法中使用 self 关键字来引用实例本身,但从没有想过为什么 self 就能取到调用当前方法对象吧。...接收消息对象(也就是self指向内容) 方法选择器(_cmd指向内容) 之所以说它们是隐藏是因为源代码方法定义没有声明这两个参数。...它们是代码被编译时被插入实现。尽管这些参数没有被明确声明,源代码我们仍然可以引用它们。...当一个对象由于没有相应方法实现而无法响应某消息时,运行时系统通过 forwardInvocation: 消息通知该对象

1.7K60

iOS: ARM64不定函数传参问题调试剖析

本文从实际开发遇到一个平台相关crash问题出发,通过代码对比,研究了x86-64架构和ARM64架构对于不定函数参数传递方式——特别是iOS系统不同之处,同时也解答了为什么调用带不定参数类型...IMP指针 ---- Objective-C方法调用是通过消息传递形式,即: [receiver message:arg] 会被编译器转化为C函数调用 objc_msgSend(receiver,...Objective-C id是一个指针类型,指向任意一个Objective-C对象,相当于void * NSObject是所有对象基类 初步分析 初步分析部分可以得到以下结论: 1.引起crash...---- crash发生在objc_storeStrong函数,猜测是ARC(自动引用计数)下导致问题,尝试process_blackhole方法参数类型修改为void *或id __unsafe_unretained...ARC复习: id类型默认所有权修饰符是id strong,超出其变量作用域时会被调用release方法 使用void *或unsafe_unretained修饰符传递参数相当于直接传递对象指针 分析

2.3K33

Objective-C Runtime编程指南(1)

当一个新对象被创建时,它内存被分配,并且它实例变量被初始化。 对象变量第一个是指向其类结构指针。 这个名为isa指针对象提供对其类访问权限,并通过类访问所有从它继承类。...他们被认为是“隐藏”,因为他们没有定义方法源代码声明。 编译代码时将它们插入到实现。 虽然这些参数没有明确声明,但源代码仍然可以引用它们(就像它可以引用接收对象实例变量一样)。...methodForSelector:返回指针必须小心转换为正确函数类型。 转换应包含返回类型和参数类型。...代理人代表另一个对象,并向其发送消息。 Objective-C“远程消息传递”讨论代理就是这样代理。代理负责消息转发到远程接收方管理细节,确保参数值连接中被复制和检索,等等。...但是它并没有试图去做其他事情。它不会复制远程对象功能,只是给远程对象一个本地地址,一个可以另一个应用程序接收消息地方。 其他类型代理对象也是可能

74520

编码篇-Block里面的小天地

下图是block数据结构定义,显而易见,Block_layout里,我们看到了isa指针为什么说block是对象呢,原因就在于isa指针objective-c语言内部,每一个对象都有一个isa...简单地讲,如果一个block没有引用外部变量并且没有被其他对象持有,就是NSConcreteGlobalBlock。...__Block_byref_i_0 结构体带有 isa,说明它也是一个对象 对于 block 外变量引用,block 默认是将其复制到其数据结构来实现访问,如下图所示(图片来自 这里): 对于用...Block使用很容易出现问题 (1)一个类中有一个Block性质属性,并且代码里面有用到,如果在对象初始时候,不做处理是会崩溃,这也是block不方便地方,不像代理可以实现也可以不实现...并且 push到这个对象时是会 崩溃, 崩溃发生在这个VC视图刚刚出现没有多久后。

59920
领券