----------------------
ASP.Net+Unity开发、
.Net培训、期待与您交流! ----------------------
如果组合或者继承需要指向子类,在都不使用对象的时候,可以在父类死亡之前的dealloc里面释放一个计数器,如果刚刚开始使用就在set方法来一个retain,这个是返回当前对象
重写dealloc返回类型是void,最后要调用父类的方法[super dealloc]
然后我们看一下另外一种方法:@autoreleasepool
遵循一个原则,alloc或者new或者copy创建的对象,都需要一个release或者autorelease
可以写类方法快速返回一个对象
例如:
遵循一个原则,alloc或者new或者copy创建的对象,都需要一个release或者autorelease
可以写类方法快速返回一个对象
例如:
遵循一个原则,alloc或者new或者copy创建的对象,都需要一个release或者autorelease
可以写类方法快速返回一个对象
例如:
ARC 机制是编译器特性,只要没有强指针指向对象,就会释放
特点:
项目里如果同时需要ARC和飞ARC的话,在不需要的的文件上面双击鼠标输入(-fno-objc-arc)
----------------------
ASP.Net+Unity开发、
.Net培训、期待与您交流! ----------------------详细请查看:
www.itheima.com
内存管理:
我们都知道iPhone的RAM都是比较小的,但是它的1G可以秒杀很多安卓手机的2GRAM,完全不会顿卡的现象。为什么会这样呢?其实就是ios开发中,我们对内存管理得很严格,坚决不允许内存泄漏,用完就及时释放,这样使ios可以高效运行程序。
然而我们必须要谈一下怎么手动去管理内存,我们总不能永远依赖系统本身管理的。下面我们看一下怎么手动去管理内存:
对象是在堆里分配内存的,而其他整型枚举之类的是存放在栈,代码块结束释放
如果创建对象之后,在使用完不释放会造成内存泄漏
对象被回收之后,指针也要指向nil,此时是不能再对对象做任何操作
dealloc方法也是类似init一样,可以重写,让对象可以再调用方法前完成某些事,dealloc还是和init的使用很相像,同样要调用super当作对象调用方法,而且这个还需要写在最后面
另外野指针是指向不可用内存,是错误的;而空指针指向0,不会报错
如果创建对象之后,在使用完不释放会造成内存泄漏
对象被回收之后,指针也要指向nil,此时是不能再对对象做任何操作
dealloc方法也是类似init一样,可以重写,让对象可以再调用方法前完成某些事,dealloc还是和init的使用很相像,同样要调用super当作对象调用方法,而且这个还需要写在最后面
另外野指针是指向不可用内存,是错误的;而空指针指向0,不会报错
如果组合或者继承需要指向子类,在都不使用对象的时候,可以在父类死亡之前的dealloc里面释放一个计数器,如果刚刚开始使用就在set方法来一个retain,这个是返回当前对象
重写dealloc返回类型是void,最后要调用父类的方法[super dealloc]
内存管理代码规范:
1 只要调用了alloc,必须有release
2 set方法额规范:
//基本类型:接赋值_age = age;
//OC对象:先判断是不是新对象传进来
if(car != _car)
{
对就对象做一次release
[_car release];
对新对象做一次retain
_car = [car = retain];
}
3 dealloc 的规范(重写)--->>>对象方法“-”
一定要调用[super dealloc]而且放到最后面
对当前对象所拥有的其他对象做一次release
一定要调用[super dealloc]而且放到最后面
对当前对象所拥有的其他对象做一次release
4 对象不是通过alloc产生的就不需要release
5 @property:如果get和set都是自己写,不会自动生成成员变量,只有不写或者只写一个才会自动生成。
这里需要注意的是retain的重复使用问题:
@class仅仅告诉编译器,某个名称是一个类
使用场合 :两个类相互引用的时候,在声明文件的时候不能#import头文件,要用@class 类名
例如:
使用场合 :两个类相互引用的时候,在声明文件的时候不能#import头文件,要用@class 类名
例如:
#import <Foundation/Foundation.h>
@class Card // 声明用@class可以提高效率,因为不用复制,仅仅用在声明中
@interface Person : NSObject // 继承父类的声明必须是#import
@property (nonatomic, retain) Card *card;
@end
/*************************************************/
#import "Card.h" // 实现是必须要用复制#import
@implementation Person
- (void)dealloc // 需要重写这个dealloc
{
[_card release];
[super dealloc];
}
@end
/**************************************************/
前面还有一个类Card的时候,两端引用如:
@property (nonatomic, assign) Person *name; // 一端用了retain,另一端不能用
@property (nonatomic, assign) Person *name; // 一端用了retain,另一端不能用
然后我们看一下另外一种方法:@autoreleasepool
@autoreleasepool
{ // 这里的括号开始代表创建了释放池
// autorelease方法会返回对象本身
// 会将对象放到自动释放池中
// 当自动释放池销毁时,会对释放池里面的所有对象release操作一遍
Person *p = [[[Person alloc] init] autorelease] ;
p.age = 10;
}
使用注意:
1 会将对象放到一个自动释放池中
2 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
3 会返回对象本身
4 调用完autorelease方法后,对象计数器不变
1 会将对象放到一个自动释放池中
2 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
3 会返回对象本身
4 调用完autorelease方法后,对象计数器不变
好处:
1 不用关心对象释放时间
2 不用关心什么时候调用release
1 不用关心对象释放时间
2 不用关心什么时候调用release
使用注意:
1 占用内存较大的对象不要随便使用autorelease
2 占用内存比较小的对象使用则没太大影响
1 占用内存较大的对象不要随便使用autorelease
2 占用内存比较小的对象使用则没太大影响
autoreleasepool是放在栈里面的,先进后出,代码块结束后弹出
遵循一个原则,alloc或者new或者copy创建的对象,都需要一个release或者autorelease
谁retain就谁release
可以写类方法快速返回一个对象
例如:
使用注意1:
1 会将对象放到一个自动释放池中
2 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
3 会返回对象本身
4 调用完autorelease方法后,对象计数器不变
1 会将对象放到一个自动释放池中
2 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
3 会返回对象本身
4 调用完autorelease方法后,对象计数器不变
好处:
1 不用关心对象释放时间
2 不用关心什么时候调用release
1 不用关心对象释放时间
2 不用关心什么时候调用release
使用注意2:
1 占用内存较大的对象不要随便使用autorelease
2 占用内存比较小的对象使用则没太大影响
1 占用内存较大的对象不要随便使用autorelease
2 占用内存比较小的对象使用则没太大影响
autoreleasepool是放在栈里面的,先进后出,代码块结束后弹出
遵循一个原则,alloc或者new或者copy创建的对象,都需要一个release或者autorelease
谁retain就谁release
可以写类方法快速返回一个对象
例如:
使用注意:
1 会将对象放到一个自动释放池中
2 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
3 会返回对象本身
4 调用完autorelease方法后,对象计数器不变
1 会将对象放到一个自动释放池中
2 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
3 会返回对象本身
4 调用完autorelease方法后,对象计数器不变
好处:
1 不用关心对象释放时间
2 不用关心什么时候调用release
1 不用关心对象释放时间
2 不用关心什么时候调用release
使用注意:
1 占用内存较大的对象不要随便使用autorelease
2 占用内存比较小的对象使用则没太大影响
1 占用内存较大的对象不要随便使用autorelease
2 占用内存比较小的对象使用则没太大影响
autoreleasepool是放在栈里面的,先进后出,代码块结束后弹出
遵循一个原则,alloc或者new或者copy创建的对象,都需要一个release或者autorelease
谁retain就谁release
可以写类方法快速返回一个对象
例如:
Person *p = [Person person];
类中的方法是:
+ (id)person
{
return [[[Person alloc] init] autorelease];
}
或者:
+ (id)personWithAge:(int)age
{
Person *p = [[[Person alloc] init] autorelease];
p.age = age;
return p;
}
主函数可以这么写:
Person *p2 = [Person personWithAge:100]; //这样就可以创建一个初始化的对象
最后我们在说一下系统的ARC吧,这个就可以帮我们省很多事,可以不用手动管内存:
ARC 机制是编译器特性,只要没有强指针指向对象,就会释放
特点:
1 不允许调用release,retain,retainCount
2 允许重写dealloc,但是不允许调用[super dealloc];
@property的参数:
2 允许重写dealloc,但是不允许调用[super dealloc];
@property的参数:
strong:成员变量是强指针,相当于retain/适用于OC对象
weak:成员变量是弱指针,相当于原来的assign/适用于OC对象/一般用于循环引用
assign:使用于非OC对象
指针分两种:1 强指针: __strong 默认的情况下 2 弱指针: __weak
weak:成员变量是弱指针,相当于原来的assign/适用于OC对象/一般用于循环引用
assign:使用于非OC对象
指针分两种:1 强指针: __strong 默认的情况下 2 弱指针: __weak
项目里如果同时需要ARC和飞ARC的话,在不需要的的文件上面双击鼠标输入(-fno-objc-arc)
ARC的循环引用即你拥有我,我拥有你,就是组合里面都有对方,这时候以前不是ARC的时候,一个是retain,一个就是assign,现在用了ARC就是在@property里面的一个用strong,一个用weak。