OC内存管理(一)
OC内存管理:
- (void)setAge:(int)age{
- _age = age;
- }
- OC对象数据类型- (void)setCar:(Car *)car
{
// 先判断是不是新传入的对象
if (_car!=car) {
// 对旧的对象release
[_car release];
// 对新的对象retain 返回值为当前对象 - (id)retain OBJC_ARC_UNAVAILABLE;
_car = [car retain];
}
}3,dealloc方法规范
-
1>一定要调用父类的方法[super dealloc];
2> 对self(当前)所拥有的的其他对象做一次release操作
-(void)dealloc
{
[_car release];
[super dealloc];
}
- 四:property的参数
1>内存管理的相关的参数retain: 会在set方法中编译器会自动release旧值,retain新值(针对OC对象类型assign:在set方法就是直接赋值(适合非OC对象,基本数据类型)copy: set方法中release旧值,copy新值,2> 是否要生成set方法(若为只读属性,则不生成)
Readonly:只读,只会生成getter的声明和实现
Readwrite:默认的,同时生成setter和getter的声明和实现
3> 多线程管理(苹果在一定程度上屏蔽了多线程操作)
Nonatomic:高性能,一般使用这个
Atomic:低性能
4> Setter和getter方法的名称修改set和get方法的名称,主要用于布尔类型。因为返回布尔类型的方法名一般以is开头,修改名称一般用在布尔类型中的getter。
@propery(setter=setAbc,getter=isRich) BOOL rich;
BOOL b=p.isRich;// 调用
五:@class 用法
@class用在.h头文件仅仅告诉编译器某个名称是一个类,当在.m中真正用到这个类的方法属性时才包含头文件声明
应用场景及好处:1>提高编译器的编译性能 问题:当某个类被多个类头文件引用的话,当被引用的类声明有更改的话,其他的引用这个类的类也要跟着变化,造成编译器编译性能降低
2>@class类循环引用的问题。
六:内存管理中retain循环引用的问题
解决方案是1,将一个类的头文件中用@class
2,属性包含关系中一端用retain,一端用assign(当然是要assign中不需要在dealloc中release)
- Person类中
-
#import "Person.h" #import "Dog.h" @interface Person : NSObject @property (nonatomic, assign) Dog *dog; @end @implementation Person - (void)dealloc { // [_dog release]; NSLog(@"person ---------dealloc"); [super dealloc]; } @end
Dog类中
-
#import "Dog.h" @class Person; @interface Dog : NSObject @property (nonatomic, retain) Person *person; @end @implementation Dog - (void)dealloc { // [_person release]; self.person = nil; // _person release] _person = nil; NSLog(@"dog-----------dealloc"); [super dealloc]; } @end
main函数中
-
#import <Foundation/Foundation.h> #import "Person.h" #import "Dog.h" int main(int argc, const char * argv[]) { Person *p = [[Person alloc] init]; Dog *d = [[Dog alloc] init]; p.dog = d; d.person = p; [d release]; [p release]; return 0;