“属性”(property)是Objective-C的一项特性,用于封装对象中的数据。OC对象通常会把其所需要的数据保存为各种实例变量。实例变量一般通过“存取方法”(access method)来访问。其中“获取方法”(getter)用于读取变量值,而“设置方法”(setter)用于写入变量值。(这一概念已经定型,并且经由“属性”这一特性而成为Objective-C 2.0的一部分)开发者可以令编译器自动编写与属性相关的存取方法。也可以使用“点语法”(dot syntax)更为容易地依照类对象来访问存取其中的数据。下面介绍与属性相关的细节。
@property 只是一个编译器指令,意思是告诉编译器要干嘛,当然它的意思就是要求 Xcode 做属性声明了。
这里的“计数”表明必然会有一个东西(变量)来记录引用的变化,而在OC里这个变量就是retainCount;那么还有一个问题就是通过什么方式来操作这个变量,OC里就是retain(引用次数加 1),release(引用计数减 1 )方法。
分类(category)与关联对象(Associated Object)作为objective-c的扩展机制的两个特性:分类,可以通过它来扩展方法;Associated Object,可以通过它来扩展属性;
每当对象创建出来,它的生命就已经开始了,一直到操作系统释放了 该对象,对象的生命才结束
strong,weak, retain, assign的区别@property的参数 先说经验 使用场合 copy:NSString,block, weak:UI控件,代理 strong:一般对象、自定义对象 在OC中:默认对对象都是强引用;如果对象没有强引用会被立即释放 assign:基本数据类型,结构体,枚举,非OC对象类型 以下扯淡的比较多 strong与weak是由ARC新引入的对象变量属性 xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和assign,是不支
ARC是什么 ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting)。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。 该机能在 iOS 5/ Mac OS X 10.7 开始导入,利用 Xcode4.2 可以使用该机能。简单地理解ARC,就是通过指定的语法,让编译器(LLVM 3.0)在编译代码时,自动生成实例的引用计数管理部分代码。有一点,ARC并不是GC,它只是一
@代表“Objective-C”的标志,证明您正在使用Objective-C语言 Objective-C语言关键词,@property与@synthesize配对使用。 功能:让编译好器自动编写一个与数据成员同名的方法声明来省去读写方法的声明。 如: 1、在头文件中: C代码 @property int count; 等效于在头文件中声明2个方法: C代码 - (int)count; -(void)setCount:(int)newCount; 2、实现文件(.m)中 C代码
变量修饰符,主要用来标识对象的生命周期.在手动内存管理方式中没有这些概念. ARC 环境下变量全部权修饰符主要有以下几个:
在上篇中,仔细分析了一下Block的实现原理以及__block捕获外部变量的原理。然而实际使用Block过程中,还是会遇到一些问题,比如Retain Circle的问题。
表明属性是只读,只需要提供getter函数即可。但是假如你还提供@synthesize那么只有getter方法是synthesized
以下:「attribute(s)」,「特性」是指同一事物(都指@property后面括号内的单词)。
图片发自简书App assign用于简单数据类型,如NSInteger,double,bool, retain和copy用于对象, readwrite是可读可写特性;需要生成getter方法和setter方法时 readonly是只读特性 只会生成getter方法 不会生成setter方法 ;不希望属性在类外改变 assign是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时; retain表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;re
最近对指针和内存有产生了浓厚的兴趣,然后就想研究一下iOS 程序指针内存对象这些东西都是怎么关联在一起的呢,又是怎么工作的呢。
在实际的开发过程中,继承和类别都会得到很多用处。对于界面相似度很高的情况下,使用继承可以节省很多代码和设置,只需要在子类中重写父类中的方法,或者增加新的子类方法即可,代码非常的简洁维护起来也很方便。下面小节下相关的知识,供需要的朋友查看。 在Objective-C中,给一个类扩展一个其它方法,有两种实现方式:类别和继承。
ARC全称Automatic Reference Counting,自动引用计数内存管理,是苹果在 iOS 5、OS X Lion 引入的新的内存管理技术。ARC是一种编译器功能,它通过LLVM编译器和Runtime协作来进行自动管理内存。LLVM编译器会在编译时在合适的地方为 OC 对象插入retain、release和autorelease代码来自动管理对象的内存,省去了在MRC手动引用计数下手动插入这些代码的工作,减轻了开发者的工作量,让开发者可以专注于应用程序的代码、对象图以及对象间的关系上。 本文通过讲解MRC到ARC的转变、ARC规则以及使用注意,来帮助大家掌握iOS的内存管理。 下图是苹果官方文档给出的从MRC到ARC的转变。
可以自己手动为实例变量在头文件 中声明setter、getter方法,并在实现文件中实现setter、getter方法。你也可以不声明不实现,但不要再企图调用setter、getter方法了,甚至点语法。
保证任何时候指向对象的指针个数和对象的引用计数相同,多一个指针指向这个对象这个对象的引用计数就加1,少一个指针指向这个对象这个对象的引用计数就减1。没有指针指向这个对象对象就被释放了。
如果该对象无需考虑多线程的情况,请加入这个属性修饰,这样会让编译器少生成一些互斥加锁代码,可以提高效率。
最近遇到一起由objc_setAssociatedObject和objc_getAssociatedObject引发的线上Crash事故,在痛心疾首的同时也觉得很有意思,特此分享。
先解析提供的要素: a.nonatomic的NSArray属性; b.异步执行,gcd并发队列; c.多个block,对myNumberArr的多次读写操作;
默认情况下,由于分类底层结构的限制,不能直接给 Category 添加成员变量,但是可以通过关联对象间接实现 Category 有成员变量的效果。 传送门:OC - Category 和 Extension
总结了Effective Objective-C之后,还想读一本进阶的iOS书,毫不犹豫选中了《Objective-C 高级编程》:
动态创建属性的应用场景:利用属性进行传值的时候,我们就可以利用本文的方法进行动态创建属性。尤其在逆向其他app的时候,往已经存在class新增一个属性,用于数据传递,尤其是异步操作的时候。
此文章由Tom翻译,首发于csdn的blog 转自:http://blog.csdn.net/nicktang/article/details/6792972 Automatic Reference
主要内容: 1.内存区域划分 2.内存管理/引用计数 3.MRC手动管理引用计数 4.ARC自动引用计数 5.内存泄漏问题 6.野指针问题
associatedObject又称关联对象。顾名思义,就是把一个对象关联到另外一个对象身上。使两者能够产生联系。目前我能想到的关联对象的使用场景有如下几点:
1.为什么main()总是返回0?可以将main()的返回结果视为“粗欧文报告”,这样0就是好消息,没有错误就是成功。 2.消息:消息发送(指令)必须写在一对括号中,并且必须包含以下两个部分。 指针,指向接收消息的对象。 方法名,要触发的方法的方法名。 3.如果在编写程序时,如声明指针时,不知道所指对象的准确类型,为此可以使用id类型。id的含义是:指针,并可以指向任意类型的Objective-C对象,e.g.: id delegate 注意:以上声明没有用星号。id已经隐含了星号的作用。 4.在obj-c中,创见对象最常见的途径就是使用alloc和init,通常会将这两个消息写在一行代码中,并以嵌套的形式连续发送(Apple推荐写法): [[NSDate alloc] init]; 5.合并存取属性的便捷方法: 在.h中国,通过@property声明属性,如 @property int w; 在impl中,要求编译器根据@property声明自动合成(synthesize)出存取方法。如: synthesize w; 6.方法前的-号表明此方法为实例方法,必须通过new才能使用; 方法前的+号表明此方法为类方法,是静态方法,无需new也能使用。 7.相互拥有的所有权关系导致相关的对象都无法被释放。这种情况称之为“retain循环”(retain cycle)。retain循环是导致内存泄露的常见原因。 8.使用弱引用(weak reference)可以解决retain循环问题。弱引用是不主张所有权的指针。 如: @interface Asset:NSObject { __weak Employee *holder; } @property (weak)Employee *holder; 9.当某个由弱引用所指向的对象被释放时,相应的指针变量会被归零,即赋为nil。 10.retain计数规则。 前提:“你”代表“当前正在使用的某个类实例”。 a.如果用来创建对象的方法,其方法名是以alloc或new开头的,或者包含copy,那么你已经得到了该对象的所有权(即可以假设该新对象的retain计数时1,且该对象不在NSAutoreleasePool对象中。)你要负责在不许要使用该对象的时候释放之。以下时部分常见会“传输”所有权的方法:alloc(后会跟一个init方法),copy和mutableCopy。 b.通过任何其他途径创建的对象(例如便捷方法),你是没有所有权的(可以假设新对象的retain计数是1,而且该对象已经在NSAutoreleasePool对象中。如果没有保留该对象,那么当NSAutoReleasePool对象被“排干”时,这个对象就会被释放。) c.如果你不拥有某个对象,但是要使用该对象的时候,可以向其发送release消息或者autorelease消息(release会使retain计数立刻减1。autorelease会导致,当NSAutoreleasePool对象被排干时,再向相应的对象发送release消息)。 d.只要对象还有至少一个拥有方,该对象就会继续存在下去(当该对象的retain计数到达0时,就会收到dealloc消息)。 11.内存管理,需要经常从局部角度来思考问题,并且以类为分界线,考虑内存管理问题,而不是去考虑应用的其他部分时怎么样处理某个对象的。 12.为什么需要一个不能修改的数组NSArray呢?原因有二: a.保证数组内容的安全。也就是说,程序在使用NSArray对象时,只能“看”不能“改”。 b.性能考虑。不可修改对象永远无需拷贝。NSArray的copy方法其实不会做任何额外的工作,仅仅返回指向自己的指针而已。而NSMutableArray的cpy方法则会制作一份自己的拷贝,并返回指向新数组对象的指针。 13.NSSet的对象是无序的,所以不能通过索引来访问。只能向NSSet对象查询某个对象是否存在,它有一个名为containObject:的方法。 14.在Apple提供的类中,有些覆盖了isEqual:方法。对于这些类,相等的(equal)和相同的(identical)是两个概念。假如程序有两个指向NSString对象的指针: NSString *x = … NSString *y = … 如果x、y保存的是完全一样的地址,则称这两个变量是“相同的”。如果x和y所指向的NSString对象包含的是相同的字符,并且排列顺序也一样,则称这两个变量是“相等的”。因此,相同的变量一定是相等的,但是相等的变量不一定是相同的。 15.C、C++、Objective-C这类语言的代码文件要经过两步才能完成编译。首先,预处理器(preprocessor)会读入并处理整个文件。接着,预处理器的输出结果会作为输入
1) 手动引用计数 MRC (Mannul Reference Counting);
Person *p = [Person new]; // 点语法的本质还是方法调用 p.age = 10; // [p setAge:10]; int a = p.age; // [p age];
iOS开发者都知道OC里面的内存管理是通过对象的引用计数来管理的,或手动MRC,或自动ARC,有些操作可以让引用计数加1,有些可以减1,一旦一个对象的引用计数为0,就回收内存了。
针对目前开发中已大多使用ARC自动引用计数技术,因此常用关键字有strong、weak、assign、copy、retain、nonatomic、atomic
首先解释ARC: automatic reference counting自动引用计数。 ARC几个要点: 在对象被创建时 retain count +1,在对象被release时 retain count -1.当retain count 为0 时,销毁对象。 程序中加入autoreleasepool的对象会由系统自动加上autorelease方法,如果该对象引用计数为0,则销毁。 那么ARC是为了解决什么问题诞生的呢?这个得追溯到MRC手动内存管理时代说起。 MRC下内存管理的缺点: 1.当我们要释放一个堆内存时,首先要确定指向这个堆空间的指针都被release了。(避免提前释放) 2.释放指针指向的堆空间,首先要确定哪些指针指向同一个堆,这些指针只能释放一次。(MRC下即谁创建,谁释放,避免重复释放) 3.模块化操作时,对象可能被多个模块创建和使用,不能确定最后由谁去释放。 4.多线程操作时,不确定哪个线程最后使用完毕
在上篇文章iOS运行时Runtime基础后,本篇将会总结Rutime的具体应用实例,结合其动态特性,Runtime在开发中的应用大致分为以下几个方面: Runtime应用.png 相关文章:iOS运行
开发前:设定开发计划、步骤开发过程中:每一个步骤告一段落之后,我们要暂停,进行代码审核,有针对性的重构(抽离重复代码,模型和视图各尽职责)
Associated Objects 是 Objective-C 2.0 中 Runtime 的特性之一。 在 <objc/runtime.h> 中定义的三个方法,
本书是iOS程序员入门的必读书籍,它讲述了在iOS开发中(Objective-C语言)可以遵循的规范和一些开发技巧。
在开发过程中,避免不了会使用公共变量,记录共享对象状态、数据最简单的方式就是创建创建公共变量。 当业务逻辑变多,还采用这种思想就会变得危险,代码逻辑变得不清晰,慢慢就有一种代码坏味道。具体总结为一下几点: 过多逻辑分支,不够清晰,公共变量不利于系统维护和项目拓展; 安全性收到威胁,过多地方共享变量,变量的写入和读取在多线程下是危险的; 业务逻辑交叉过多时,很难保证数据-逻辑的一致性; 出现问题解决问题,Objective-C针对上述问题,提供了一个解决方案:即关联对象(Associated
或者使用objc_setAssociatedObject函数将key指定的关联对象设置为nil;
我们在声明@property 属性时,总是要在括号中写上assign、retain、copy、weak、strong中的一个,很多时候,我们仅仅只是按照习惯去写经常写的那一个,但有时候看代码时又会发现别人用的不尽相同,那这些之间的区别是什么呢?
【摘要】这篇文章,首先在第1节中介绍Block的定义,以及与C里面函数的对比。然后,第2节介绍实际开发中经常会用到的Block语法形式,以供读者日后查阅。只知道怎么用却不知什么时候用?所以随后的第3节将介绍Block的应用场景。然而,用Block不当导致了Crash?所以,第4节有必要了解Block捕获变量的特性,以及循环引用的解决。另外,千万不要懒,一碰到Block就weak,要区分哪些不会引起循环引用。然而,如果对Block的内存机制不熟悉,也会导致Crash,所以第5节会介绍Block的内存机制。学到这里已经够用了。然而,你却想进一步了解Block的实现机制?第6节将简单介绍下clang的编译与Block的实现及其原理。
因为ReactiveObjC只能监听NSObject类型的数据,所以一般为了能监听BOOL值的类型,我们会用NSNumber来实现BOOL。
在这篇文章中,我会总结最近对iOS开发内存课题的查阅和学习,文章的中心还是围绕着面试题来的。因为网上目前确实存在着很多的面试题和答案,但他们大多数都是拷贝粘贴,甚至答案都是错的。
什么情况使用 weak 关键字,相比 assign 有什么不同? 什么情况使用 weak 关键字? 在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: de
OC基础总结 重新回过头看这些基础知识,对许多知识点都有新的认识,拥有坚实的基础才能更快的成长。 OC内存管理 - 基础与MRC 内存管理概述 内存管理 内存的作用:存储数据。 1). 如何将数据存储到内存之中。 声明1个变量,然后将数据存储进去。 2). 当数据不再被使用的时候,占用的内存空间如何被释放。 内存中的五大区域 栈: 局部变量,当局部变量的作用域被执行完毕之后,这个局部变量就会被系统立即回收。 堆: OC对象,使用C函数申请的空间。需要我们自己进行内存管理 BSS段: 未初始化的
声明:对某个属性的访问(access)包括getter和setter。以下所说的访问是指setter。
其实block是苹果官方强烈推荐,比代理好使。 那么我们要定义block怎么做?
typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) { OBJC_ASSOCIATION_ASSIGN = 0, // 指定一个弱引用相关联的对象 OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, // 指定相关对象的强引用,非原子性 OBJC_ASSOCIATION_COPY_NONATOMIC = 3, // 指定相关的对象被复制,非原子性 OBJC_ASSOCIATION_RETAIN = 01401, // 指定相关对象的强引用,原子性 OBJC_ASSOCIATION_COPY = 01403 // 指定相关的对象被复制,原子性 };
OC语言使用引用计数来管理内存,每一个对象都有一个可以递增递减的计数器,如果引用这个对象,那么这个对象的引用计数递增,如果不用了,那么这个对象引用计数递减,直到引用计数为0,这个对象就可以销毁了
面试题 Category能否添加成员变量?如果可以,如何给Category添加成员变量? 答:不能直接添加成员变量,但是可以通过runtime的方式间接实现添加成员变量的效果。 RunTime为Category动态关联对象 使用RunTime给系统的类添加属性,首先需要了解对象与属性的关系。我们通过之前的学习知道,对象一开始初始化的时候其属性为nil,给属性赋值其实就是让属性指向一块存储内容的内存,使这个对象的属性跟这块内存产生一种关联。 那么如果想动态的添加属性,其实就是动态的产生某种关联就好了。而想要
领取专属 10元无门槛券
手把手带您无忧上云