OC学习笔记 ARC 强指针和弱指针 内存管理

强调一些概念

类:是一种结构,它表示对象的类型,对象引用类来获取和本身有关的各种信息,特别是运行什么代码来处理每种操作。

对象:是一种结构,它包含值和指向其类的隐藏指针。

实例:对象的另一种称呼。

消息:是对象可以执行的操作,用于通知对象去做什么。对象接收消息后,将查询对应的类,以便查找正确的代码来运行。

方法:是为响应消息而运行的代码,根据对象的类,消息可以调用不同的方法。

接口:是对象的类应该提供特殊的特性的描述。

oc中访问成员变量的四种方式

用法如:@property (attribute1,attribute2) float value;

这些attribute包括:

readonly  表示这个属性是只读的,就是只生成getter方法,不会生成setter方法。 

readwrite 可读可写(默认)设置可访问级别。

assign:简单赋值,不更改索引计数

copy:建立一个索引数为1的对象,然后释放旧对象

retain:释放(release)旧对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1

nonatomicnonatomic 非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,
则默认是两个访问方法都为原子型事务访问。

前两个只是简单的设定变量的可读写性。

copy其实是建立了一个相同的对象,而retain不是:

比如一个NSString对象,地址为0x1111,内容为@"STR" ,copy到另外一个NSString之后,地址为0x2222,内容相同,新的对象retain为1,旧有对象没有变化。

旧有对象没有变化。

retain 到另一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1,也就是说,retain是指针拷贝,copy是内容拷贝。在拷贝之前,都会释放旧的对象。

assign:简单赋值,不更改索引计数(Reference Counting)。

copy:建立一个索引计数为1的对象,然后释放旧对象

retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的输入对象的索引计数为1

使用assign:对基础数据类型(NSInteger)和C数据类型(int ,float,double,char等)

使用copy:对NSString

使用retain:对其他NSObject和其子类。

什么是property?

property是一种代码生成机制,能够生成不同类型的getter/setter函数,特别是如果你想要用点(.)操作符号来存取变量的话,你就能必须使用property。

@class

objective-c中,一种是通过#import方式引入;另一种是通过@class引入;

Person.h-person.m

1 #import <Foundation/Foundation.h>
2 @class Dog;//当一个类使用到另一个类时,并且在类的头文件中需要创建被引用的指针时。需要在头文件中引用@class 它类名 如:person类引入dog类对象
3 @interface Person : NSObject
4 @property (nonatomic,strong) Dog *dog;
5 @property (nonatomic,assign) int age;
6 @property (nonatomic,strong) NSString *name;
7 @end
1 #import "Person.h"
2 #import "Dog.h"
3 
4 @implementation Person :NSObject
5 - (void)dealloc
6 {
7     NSLog(@"Person is dealloc");
8 }
9 @end

总结一下

@class是放在interface中的,只是为了在interface中引用这个类,把这个类作为一个类型来用的。 在实现这个接口的实现类中,如果需要引用这个类的实体变量或者方法之类的,还是需要import在@class中声明的类进来. 

@property参数详解

1>strong :强指针(适用于oc对象类型)

2>weak  :弱指针(适用于oc对象类型)

3>assign:适用于基本数据类型(即非OC对象类型)

ARC ( iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting)自动引用计数

 ARC的判断准则:只要没有强指针指向对象,就会释放对象

    a)在ARC机制中,所有的retain,release都不能再出现,取而代之的则是strong(强指针)和weak(弱指针)

    b)默认情况下,所有的指针都是强指针类型

    c)只要有强指针指向一个对象,那么系统就不会回收该对象;反之,则立即回收该对象

 

@property中的strong和weak属性

    a)arc中的strong相当于非arc时的retain

    b)arc中的weak相当于非arc时的assign

    c)arc机制情况下不能再出现 [super dealloc];

    d)基本数据类型依然使用assign修饰,对象一般用strong修饰

    e)当arc机制下对象循环依赖时,这时weak就有用处,结合@class。否则都是strong对方会相互拉着对方,释放不了内存

 Person.h

1 #import <Foundation/Foundation.h>
2 @class Dog;
3 @interface Person : NSObject
4 @property (nonatomic,strong) Dog *dog;
5 @end

 Dog.h

#import "Foundation/Foundation.h"
#import "Person.h"
@class Person;
@interface Dog : NSObject
//当出现类循环应用的时候,只需要把一方面的Strong引用改为weak,并且在.h文件中使用@class 类名的方式,通知.h文件类的存在 @property (nonatomic,weak) Person
*p; @end

OC中ARC机制中还有内存泄漏吗

基于计数的内存管理是无法处理循环引用的,这和自动不自动没有关系。
另外不管用什么管理方式都解决不了,其实对象已经没用了但是忘了撒手”的bug。
比如即便你没循环引用,但是有一个生存期很长的变量保存着一个根本没用的对象的引用还是会泄露的。基于xcode arc机制 只要不影响程序性能编程并不关心。

xcode中非arc工程转换成arc工程

以上方法在一些大的项目可能不太使用,因为可能转换会很耗时,而且系统自动帮忙转换时避免不了会出错。

    在实际开发中,若我们用到一些之前第三方的非arc文件,可以使用以下方法让它们运行在arc工程下

-fno-objc-arc

原文地址:https://www.cnblogs.com/zhangdashao/p/4458431.html