首页
学习
活动
专区
工具
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,信息包含成员变量、方法名称、方法的实现(即函数指针)、属性以及父类的指针。

63140

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

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

30920
  • 重新回味·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语言不允许这样编译的。

    63940

    深入理解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语言数组的截获。

    97710

    Objective-C笔记

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

    95740

    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.2K40

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

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

    38130

    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,而不是对象)。

    64820

    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对象进行转换。...而在使用__bridge将void *类型转换为id类型时,一定要注意此时对象的内存管理还是由开发者手动管理,记得在不需要对象时进行释放,否则内存泄漏!..._Nonnull' // 不兼容的指针类型,将 CGColorRef(又称 struct CGColor *)作为 id 类型参数传入 使用桥接转换函数参数 当在函数调用中在Objective-C

    2.2K10

    iOS工程师必看的 20 道 面试题

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

    3.8K40

    面经之《招聘一个靠谱的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指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行,如果,在最顶层的父类中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常

    1K100

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

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

    61410

    利用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

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

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

    33720

    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

    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时,首先根据对象receiver的isa指针查找到它对应的类,然后在类的methodLists中搜索方法,如果没有找到,就使用super_class指针到父类中的

    59320

    Objective-C Runtime详解

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

    1.8K60

    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.5K33

    Objective-C Runtime编程指南(1)

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

    82120
    领券