您的位置:首页 > 其它

4.内存管理

2015-07-28 09:03 253 查看

1.Boy.h文件

#import <Foundation/Foundation.h>
@interface Boy : NSObject<NSCopying>

@property(nonatomic,retain)NSMutableArray *arr;
@property(nonatomic,copy)NSString *name;
@property(nonatomic,assign)NSInteger age;
@property(nonatomic,retain)Girl *girl;

- (void)setName:(NSString *)name;
+ (Boy *)boy;
//自己定义的初始化方法
- (id)initWithName:(NSString *)name age:(NSInteger)age;
//便利构造器初始化方法
+ (id)boyWithName:(NSString *)name age:(NSInteger)age;

@end


2.Boy.m文件

#import "Boy.h"
@implementation Boy

+ (Boy *)boy
{
Boy *boy = [[Boy alloc] init];
return [boy autorelease];
}

- (id)initWithName:(NSString *)name age:(NSInteger)age
{
self = [super init];
if (self) {
//_name = name;
//_age = age;
//内存的优化---------------->
self.name = name;
_age = age;//<--->self.age = age
//对象创建之后,里面的数组也会创建好,不用在外面进行创建,以免忘了造成问题
self.arr = [NSMutableArray array];
}
return self;
}

+ (id)boyWithName:(NSString *)name age:(NSInteger)age
{
Boy *boy = [[Boy alloc] initWithName:name age:age];
return [boy autorelease];
}

//setter方法的完整版-------------->
- (void)setName:(NSString *)name
{
//设置器里面不能对属性赋值,只能对成员变量赋值
// self.name = name; (导致死循环)
//刚开始_name为nil,对nil进行release对系统而言就是一句废话不执行
if (_name != name) {
[_name release];
_name = [name retain];
}
//[name retain];
//[_name release];
//_name = name;
}

//实现NSCopying协议方法
-(id)copyWithZone:(NSZone *)zone
{
Boy *boy = [Boy allocWithZone:zone];
boy.name = _name;
boy.age = _age;
return boy;
}

//把成员变量里面的+1的操作全部减去
- (void)dealloc
{
[_name release];
[_girl release];
[super dealloc];
}

@end


3.内存管理

//对象被创建出来之后的引用技术retainCount就是1
Boy *boy = [[Boy alloc] init];//--->+1
//retain对对象的引用计数+1;release对对象的引用计数-1
[boy retain];//--->+2
[boy release];//--->+1
//当对象retainCount为1时再调用release的时候,这个对象就不在对他的引用计数进行-1操作,而是直接调用dealloc方法,所以我们在访问对象的引用计数还是1
[boy release];//--->+1
//NSString的对象在全局静态区,她的引用计数为-1,代表正整数的最大值,其他的对象都在堆区
NSString *str = @"heihei";//retainCount--->-1
NSString *str = [[NSString alloc] initWithString:@"hehei"];//retainCount--->-1
//如果对象是我们进行alloc或则retain之后我门就获取了对象的所有权,就可以对对象进行release操作
//便利构造器在返回对象的时候会加上一个autorelease.所以由它创建对象不需要对内存进行管理
NSArray *arr1 = [[NSArray alloc] initWithObjects:@"1",@"2", nil];
NSArray *arr2 = [NSArray arrayWithObjects:@"3",@"4", nil];
[arr1 release];
//id是泛型指针,可以用在任何的方法中,但是instancetype代表实例类型,用在自定义初始化方法,便利构造器作为返回值类型使用,标识方法会返回一个对象回去
//不可变字典可以通过mutableCopy转换成可变的数组字典
//mutableCopy出来的对象是可比变的,copy是不可变的
Boy *boy = [Boy boyWithName:@"zhangyan" age:22];
Boy *newBoy = [boy copy];
//如果自己的类(或者系统的类)想要实现copy功能,就必须遵守和实现NSCopying协议方法copyWithZone
//copy也可以改变引用计数,但是他改变的是新对象的引用计数,而原来的引用计数不变
//当对象放入到容器Array或者字典中,对象会被容器进行一次持有,就是retain一次,他的引用计数就会+1,是为了防止空指针的问题,从容器中移除时就会相应的-1
Boy *boy1 = [[Boy alloc] init];//boy1.retainCount--->+1
NSMutableArray *arr = [NSMutableArray arrayWithObjects:boy1 ,nil];
NSLog(@"%ld",[boy1 retainCount]);//--->+2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: