内存管理机制 Thread 1:EXC_BAD_ACCESS(code=EXC_I386_GPFLT)错误

本文介绍了iOS中ARC机制的引入及其对内存管理的影响。详细解释了在ARC之前的手动内存管理方式,包括引用计数、内存管理原则及野指针和内存泄露等问题。此外还探讨了@property属性的不同参数配置。

转自:http://blog.youkuaiyun.com/lichang719/article/details/46619985

iOS5之后苹果公司引入了ARC机制,大大方便了iOS开发者对内存的管理机制。在iphone 4出世的时候为什么ios在512M的内存中可以运行很大的游戏,保持畅快流畅的状态。得益于ios非常好的内存处理机制。

      在我们现在创建项目的时候,默认会直接引入ARC机制,我们可以关闭ARC机制:在输入框中输入long点击搜索按钮,如图:技术分享

         接下来即可进行老版本的内存操作了。

在老版本中,内存操作采用了引用计数(retainCount)alloc retain(+1)release(-1)

内存管理原则(配对原则):只要出现了new,alloc,retain,就一定配对出现一个release,autorelease

使引入数+1,必须对应的-1,务必成对存在

ClassA *obj1 = [[ClassA alloc] init]; //retaincount = 1

ClassA *obj2 = obj1; //retaincount = 1

[obj2 retain]; //retaincount = 2

当引入计数变为0的时候,会自动调用系统的dealloc系统函数

-(void)dealloc

{

[super dealloc];//注意一定要调用父类函数

NSLog(@"对象被删除");

 }

野指针:

在开发中经常会遇到野指针,系统一般会提示为Thread 1:EXC_BAD_ACCESS(code=EXC_I386_GPFLT)错误。因为你访问了一块已经不属于你的内存。

但我们在开发中可能会发现系统并不会时时检测野指针,主要是为了提高编译效率,默认关闭了野指针检测机制,打开方法:技术分享技术分享 

在Enable Zombie Objects上点击对号,关闭即可。

注意:一般我们最好不要打开该机制,这样编译时的效率将大大降低。

内存泄露:

只要对象的retainCount !=0就会一直存在在内存中,不再被使用的对象,一直在内存中没有被销毁,则会造成内存泄露。

@property 参数

1.与set方法内存管理相关参数

retain:要生成符合内存管理原则的set方法(应用与对象类型)

assign:直接赋值(对象类型,基本数据类型)

capy

2多线程相关

nonatomic:不生成多线程代码。(一般都用这个,效率高)

atomic:生成多线程管理代码

3.是否要生成set跟get方法

readwrite:可读可写属性,同时生成set跟get方法

readonly:只读属性,只生成get方法

4.set与get方法名称相关的参数

setter:设置生成set方法的名称

getter:设置生成的get方法名称

实例:

@property(nonatomic,retain)Class *class;

@property(nonatomic,retain)NSString *name;

@property(nonatomic,assign)int age;

@property(nonatomic,assign,readonly)int age;

@property(nonatomic,assign,setter=abc:)int age;//注意有冒号

Thread 1exc_bad_accesscode=1,address=0xffc)是一个常见的错误,通常出现在iOS开发中。这个错误表示程序试图访问一个已经被释放或无效的内存地址,导致程序崩溃。以下是一些可能的原因和解决方法: ### 可能的原因 1. **访问已释放的对象**: - 这种情况通常发生在对象被释放后,仍然有指针指向它,导致程序试图访问这个无效的内存地址。 2. **野指针**: - 野指针是指指向一个已释放或无效内存的指针。使用野指针会导致程序崩溃。 3. **内存管理问题**: - 在手动管理内存的情况下,忘记释放对象或多次释放同一个对象都会导致内存错误。 4. **循环引用**: - 对象之间的循环引用会导致内存无法被正确释放,从而引发内存错误。 ### 解决方法 1. **使用Xcode的Zombie Objects**: - 在Xcode中启用Zombie Objects可以帮助你检测访问已释放对象的情况。打开方法:Product -> Scheme -> Edit Scheme -> Run -> Diagnostics -> Enable Zombie Objects。 2. **使用Instruments工具**: - 使用Instruments中的Leaks和Allocations工具可以帮助你检测内存泄漏和野指针。 3. **避免循环引用**: - 使用弱引用(weak)或无主引用(unowned)来避免循环引用。 4. **检查内存管理**: - 确保每个对象的内存管理正确,避免内存泄漏和多次释放。 ### 示例代码 ```swift class Person { var name: String weak var partner: Person? // 使用弱引用避免循环引用 init(name: String) { self.name = name } deinit { print("\(name) is being deinitialized") } } var john: Person? = Person(name: "John") var jane: Person? = Person(name: "Jane") john?.partner = jane jane?.partner = john john = nil jane = nil ``` 在这个示例中,`partner`属性被声明为`weak`,从而避免了循环引用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值