Objective-C 2.0中的属性机制为我们提供了便捷的获取和设置实例变量的方式,也可以说属性为我们提供了一个默认的设置器和访问器的实现。...在学习OC中属性之前我们先要知道为什么要为变量实现getter和setter方法,我们先来了解一下实例的作用域。 实例变量的作用域如下: 1....@protected :受保护的,该实例变量只能在该类和其子类内访问,父类protected的实例变量在子类中是private的默认是protected; 3....在使用getter和setter方法时有一点要注意:以neme为例,getter方法名为 name, 而setter的名为 setName;在使用getter和setter方法时和普通的函数用法一样 ...weak : 表示弱引用,不拥有对象的所有权,当目标对象被销毁之后,属性值会被自动设为nil; assign(赋值): 直接赋值,计数器不会加一,简单的赋值方法,默认赋值方式
而栈上的内存系统会自动处理,不会造成野指针。 copy与strong类似。不同之处是strong的复制是多个指针指向同一个地址,而copy的复制每次会在内存中拷贝一份对象,指针指向不同地址。...闭包就是没有名字的函数,或者理解为指向函数的指针。 3....File-private 也是 Swift 3 新添加的权限。其被修饰的对象只能在当前文件中被使用。例如它可以被一个文件中的 class,extension,struct 共同使用。...Private 是最低的访问权限。它的对象只能在定义的作用域内使用。离开了这个作用域,即使是同一个文件中的其他作用域,也无法访问。 11....具体过程是在Objective-C中对象调用方法时,如self.tableview reload,发生了两件事。
NSObject还有些方法能在运行时获得类的信息,并检查一些特性,比如class返回对象的类;isKindOfClass:和isMemberOfClass:则检查对象是否在指定的类继承体系中;respondsToSelector... *cache; //因为Objective-C的消息转发需要查找dispatch table甚至可能需要遍历继承体系,所以缓存最近使用的方法。 ...,本质上是一个函数指针 } IMP:具体的方法的地址,IMP 是一个函数指针,这个被指向的函数包含一个接收消息的对象id(self ...1、不能添加成员变量,会报错 这个函数只能在“构建一个类的过程中”调用。一旦完成类定义,就不能再添加成员变量了 六、KVC与KVO 1、KVC KVC运用了isa-swizzing技术。...isa指针(is kind of 的意思)指向维护分发表的对象的类,该分发表实际上包含了指向实现类中的方法的指针和其他数据。
,指向他的类对象,类对象中存放着本对象的如下信息 对象方法列表 成员变量的列表 属性列表 每个 Objective-C 对象都有相同的结构,如下图所示 | Objective-C 对象的结构图 | |...而 super 本质是一个编译器标示符,和 self 是指向的同一个消息接受者 * 当使用 self 调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找; * 而当使用 super...能否向运行时创建的类中添加实例变量?为什么?...在Objective-C中向nil发送消息是完全有效的——只是在运行时不会有任何作用 如果一个方法返回值是一个对象,那么发送给nil的消息将返回0(nil) 如果方法返回值为指针类型,其指针大小为小于或者等于...如果向一个nil对象发送消息,首先在寻找对象的isa指针时就是0地址返回了,所以不会出现任何错误 objc中向一个对象发送消息obj foo和objc_msgSend()函数之间有什么关系?
遗留下来的“传统”,在 MRC 中,方法内部的 block 是在栈区的,使用 copy 可以把它放到堆区.在 ARC 中写不写都行:对于 block 使用 copy 还是 strong 效果是一样的,...“属性” (property)作为 Objective-C 的一项特性,主要的作用就在于封装对象中的数据。 Objective-C 对象通常会把其所需要的数据保存为各种实例变量。...每一个对象内部都有一个isa指针,指向他的类对象,类对象中存放着本对象的 对象方法列表(对象能够接收的消息列表,保存在它所对应的类对象中) 成员变量的列表, 属性列表, 它内部也有一个isa指针指向元对象...每个 Objective-C 对象都有相同的结构,如下图所示: enter image description here 翻译过来就是 Objective-C 对象的结构图 ISA指针 根类的实例变量...这也就是为什么说“不推荐在 init 方法中使用点语法”,如果想访问实例变量 iVar 应该使用下划线( _iVar ),而非点语法( self.iVar )。
NSObject还有些方法能在运行时获得类的信息,并检查一些特性,比如class返回对象的类;isKindOfClass:和isMemberOfClass:则检查对象是否在指定的类继承体系中;respondsToSelector...PS:isa指针不总是指向实例对象所属的类,不能依靠它来确定类型,而是应该用class方法来确定实例对象的类。...中_class_lookupMethodAndLoadCache3(为什么有个这么奇怪的方法。...,使用 class_copyPropertyList 函数只能获取类的属性,而不包含成员变量。...方法中的隐藏参数 我们经常在方法中使用 self 关键字来引用实例本身,但从没有想过为什么 self 就能取到调用当前方法的对象吧。
3.2 方法中的隐藏参数 我们经常在方法中使用 self 关键字来引用实例本身,但从没有想过为什么 self就能取到调用当前方法的对象吧。...2) 为什么self.name的输出为? ...7.3 具体使用 7.3.1 创建关联 创建关联要使用到Objective-C的运行时函数: objc_setAssociatedObject来把一个对象与另外一个对象进行关联...7.3.2 获取相关联的对象 获取相关联的对象时使用Objective-C函数objc_getAssociatedObject。...通常情况下不建议使用这个函数,因为他会断开所有关联。只有在需要把对象恢复到“原始状态”的时候才会使用这个函数。
持有,而被别的对象持有,同时不产生循环引用的时候,就不需要使用 weak self 了。...题目 3:为什么 block 里面还需要写一个 strong self,如果不写会怎么样?...另外,有读者评论说使用方括号的形式是为了向下兼容 C 语言,我并不觉得中括号是唯一选择,C++ 不也兼容了 C 语言么?Swift 不也可以调用 C 函数么?...题目 11:Objective-C 对象内存结构中的 isa 指针是用来做什么的,有什么用? Objective-C 是一门面向对象的编程语言。每一个对象都是一个类的实例。...在 Objective-C 语言的内部,每一个对象都有一个名为 isa 的指针,指向该对象的类。每一个类描述了一系列它的实例的特点,包括成员变量的列表,成员函数的列表等。
,再将输入对象的索引值计数增加1 weak:不增加引用计数,不持有对象,所以不能决定对象的释放,对比assign好处是,当对象消失时指针自动归为nil assign:适用于基础数据类型,不增加引用计数,...也可以用retain,block的retain行为默认为copy行为实现的,block变量默认是声明为栈变量的,为了能在block的声明域外使用,所以要把block copy到堆中,为了属性声明和实际操作一致...因为他总是在超出他的作用域时被自动销毁了 在objective-c中只支持一个类型对象:block 堆区(heap):一般由程序员分配释放,若程序员不释放,则可能会引起内存泄漏。...在释放时,调用clearDeallocating函数。该函数首先根据对象地址获取所有weak指针地址的数据,然后遍历数据把其中的数据置为nil,最后把记录从weak表中删除,清理对象的记录。...protocol中是希望遵守协议中的对象实现该属性;category需要增加属性的实现时,需要分别使用两个函数:objc_setAssociatedObject和objc_getAssociatedObject
NSObject还有些方法能在运行时获得类的信息,并检查一些特性,比如class返回对象的类;isKindOfClass:和isMemberOfClass:则检查对象是否在指定的类继承体系中;respondsToSelector...PS:isa指针不总是指向实例对象所属的类,不能依靠它来确定类型,而是应该用class方法来确定实例对象的类。...selector,不缓存,方法返回,否则 转发这个selector,否则 报错,抛出异常 从上面的分析中我们可以看到,当一个方法在比较“上层”的类中,用比较“下层”(继承关系上的上下层)对象去调用的时候...,使用 class_copyPropertyList 函数只能获取类的属性,而不包含成员变量。...方法中的隐藏参数 我们经常在方法中使用 self 关键字来引用实例本身,但从没有想过为什么 self 就能取到调用当前方法的对象吧。
参数的检查回调,只需要在before_msgSend函数里面挨着调用一下外部传入的函数指针。...首先MethodMatcher *指针的访问安全使用一个互斥锁就行了,关键是 MessageMock 有两个重要的能力是修改返回值和入参,当这些自定义返回值是 Objective-C 对象时,代码里面直接通过汇编指令操作...,编译器不能在合适的地方插入retain,那这些 Objective-C 对象就可能提前释放(比如当前作用域结束)。...由于这些对象都是依附于MethodMatcher *存在,所以这些引用计数被加一的 Objective-C 对象不释放,那MethodMatcher *也不能释放。...上层使用的考虑 而考虑到上层接口是在 Objective-C 环境中运行,若一个作用域还未结束,这个MethodMatcher *就被释放了就会 Crash,所以上层接口层面是这样设计的: @implementation
( )代码是Objective-C与C语言进行桥接的方法,使用__bridge_retained方法自行管理内存。...__bridge_retained将Objective-C转换成C语言,OC对象将所有权交给CF对象,但会解除自动管理内存机制ARC的所有权,意味着要自行进行内存管理。...__bridge_transfer内部方法 此处为什么将该block转换成C函数?...将Objective-C对象转换成C函数的,而C函数可以直接拿到相应的函数指针,拿到函数指针之后就可以指向任意类型,即重定向指针。此处重定向指针之后,会在dispose方法进行指针处理。...因为持有该销毁信号对象的是当前类,在RAC信号销毁过程中内部方法无法对其进行销毁操作,最终会导致内存泄漏问题 ? 销毁信号使用成员变量而非临时变量,导致的内存泄漏
在Objective-C中,给一个类扩展一个其它方法,有两种实现方式:类别和继承。 ---- 继承 这个是面向对象语言都有的一个特性,子类会继承父类的方法和属性以及成员变量。 ...; @protected 受保护成员,只有当前类或子类可以访问(如果没有添加任何修饰则默认为@protected); @public 公共成员,所有类均可访问; 类别category...对象中有一个isa指针,该指针指向调用该对象的类。...atomic 是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。...weak weak比assign多了一个功能,当对象消失后自动把指针变成nil,好处不言而喻。弱引用除了不决定对象的存亡外,其他与强引用相同。
块对象和函数指针的定义使用功能都差不多,块对象的精髓之处就在于,在块对象中可以访问到上下文的变量,而函数指针不能。...3)在现实的实现中,当函数内的块语法不包含自动变量的时候,就没必要进行复制值,所以块对象的内存区域也会被保存在静态数据区。...有一个函数可以复制块对象到新的堆内存,通过使用该函数,即使是在函数内部定义的块对象也能独立于栈被持续的使用,此外还有一个函数可以释放不需要的块对象。...7)在多线程环境下(block中的weakSelf有可能被析构的情况下),需要先将self转为strong指针,避免在运行到某个关键步骤时self对象被析构。...第四、五、六行,如果不转成strongSelf而使用weakSelf,后面几句话中,有可能在第四句执行之后self的对象可能被析构掉,然后后面的StausBlock没有执行,导致逻辑错误。
下图是block的数据结构定义,显而易见,在Block_layout里,我们看到了isa指针,为什么说block是对象呢,原因就在于isa指针,在objective-c语言的内部,每一个对象都有一个isa...我们可以这样理解,我们通过这个Block变量名称来获取Block的指针,然后通过这个指针就可以来使用Block函数。...typedef void(^Blo)(NSString *s1,UIColor *c); 逆向传值 前面我们已经知道Blcok是一个匿名函数,同时也是一个指针,那么使用Block就可以弥补在iOS中函数传递的功能...block的代码是内联的,效率高于函数调用 block对于外部变量默认是只读属性 block被Objective-C看成是对象处理 小结 后续会持续更新 本文参考文章 深入浅出-iOS Block原理和内存中位置...唐巧-谈Objective-C block的实现 深究Block的实现 Objective-C中的Block
不同之处是 strong 的复制是多个指针指向同一个地址,而 copy 的复制每次会在内存中拷贝一份对象,指针指向不同地址。...其中所有线程中,只有主线程的 runloop 是默认启动的,main 函数会设置一个 NSRunLoop 对象。...而所谓 block,就是 Objective-C 对于闭包的实现。闭包就是没有名字的函数,或者理解为指向函数的指针。 7.什么是 block?它和代理的区别是什么?...block 出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者 block 置 nil 后才消除;delegate 只是保存了一个对象指针,直接回调,没有额外消耗。...上面的代码中,两个指针指向不同的对象,尽管它们的值相同。但是 iOS 的编译器优化了内存分配,当两个指针指向两个值一样的 NSString 时,两者指向同一个内存地址。
比如,我们经常会在开发中使用到NSError打印错误信息,我们通常会在方法的参数中传递NSError对象的指针。...在《从 MRC 说起 —— 你不持有通过引用返回的对象》章节中也说到,Cocoa 中的一些方法指定通过引用返回对象(即,它们采用ClassName **或id *类型的参数),常见的就是使用NSError...,将 CGColorRef(又称 struct CGColor *)作为 id 类型参数传入 使用桥接转换函数参数 当在函数调用中在Objective-C和Core Foundation对象之间进行转换时...但是赋值以及使用附有__weak修饰符的变量都必须恰当地使用 objc4 运行时库中的函数,因此独自实现引用计数机制的类大多不支持__weak修饰符。...OS X Mountain Lion v10.8 中不推荐使用GC机制,并且将在 OS X 的未来版本中删除GC机制。ARC是推荐的替代技术。
shareByChannel=link这篇文章深入浅出地讲解了C语言指针的相关知识,让我受益匪浅。作者从指针的基本概念讲起,逐步深入到指针的用法、指针与数组、指针与函数等高级应用,条理清晰,通俗易懂。...代码示例也非常实用,让我在实际编程中能够更好地运用指针。...封装性:面向对象编程通过将数据和行为封装在一个对象中,实现了数据的隐藏和保护。这样可以防止外部直接访问和修改对象的内部状态,提高代码的安全性和稳定性。...但是,在Python中,私有属性和方法并不是真正无法访问的,而是进行了名称修饰,将其名称变更为_类名__属性名或_类名__方法名的形式,以实现一定程度的隐藏。受保护的访问控制:单下划线_作为前缀。...受保护属性和方法可以被类的实例和子类访问,但约定上不建议直接访问。这种访问控制主要是一种约定,用于告诉其他开发者某个属性或方法被认为是类内部使用的,不建议在外部直接使用。
引言 get 和post 布尔值参数处理( 使用NSNumber 传BOOL值) 全局的const常量代替宏常量,节省内存空间。 敏感逻辑的保护: 把函数名隐藏在结构体里,以函数指针成员的形式存储。...For example 在这里插入图片描述 平常也可以使用@ 来快速包装数字类型以对象的形式进行存储和传参 [discountArray addObject:[[ self class] mj_objectWithKeyValues...内存只有一份 III 扩展:敏感逻辑的保护 https://blog.csdn.net/z929118967/article/details/115857706 3.1 把函数名隐藏在结构体里,以函数指针成员的形式存储...把函数名隐藏在结构体里,以函数指针成员的形式存储。...,以函数指针成员的形式存储。
领取专属 10元无门槛券
手把手带您无忧上云