【2015-10-19】内存管理---深浅拷贝,autorelease,ARC(自动引用计数)
【2015-10-19】内存管理---深浅拷贝,autorelease,ARC(自动引用计数)
尘埃眠于光年yr 发表于2年前
【2015-10-19】内存管理---深浅拷贝,autorelease,ARC(自动引用计数)
  • 发表于 2年前
  • 阅读 59
  • 收藏 2
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 内存管理---深浅拷贝,autorelease,ARC(自动引用计数)

一.复习内存管理中的MRC(手动管理内存)

1.还是遵循谁retain,谁release的原则;

2.遛狗练习的中途换狗问题,在person的.m文件中重写setdog方法

- (void) setDog:(Dog *)dog{

    //DogA 计数器 - 1

    [_dog release];

    //当前溜的DogB

    _dog = dog;

    //DogB 计数器 + 1

    [_dog retain];

}

3.关于retainCount为1,-1,0,无穷大的条件

(1)为1时 是对象计数 当创建对象时或者对象即将释放时为1,即对象计数器最小为1.

(2)为0时 当一个指针的值为空时。

(3)为-1或无穷大时 当一个数据类型被赋值时。

不可变对象通常被称为静态常量,这类对象一般不能用于计数,而可变的对象是可以用来计数的

二.学习了浅拷贝和深拷贝

1.浅拷贝 copy 通常指针对于指针进行拷贝,特点为:通过多个指针指向同一片内存地址。

如  NSString *string = @"123";

    NSString *stringI = [string copy];

这时string和stringI输出的内存地址相同

2.深拷贝 mutableCopy 指的是赋值内容并且重新创建一块内存地址

如  NSString *stringII = [string mutableCopy];

这时string和stringII输出的内存地址不相同

三.自动释放池(autorelease)

1.autorelease通常有作用域,当在作用域范围内的创建特定的对象时,出去作用域计数器就会-1

如 @autorelease{

    Person *personP = [[Person alloc]autorelease];

//特定的autorelease创建的对象才在出去作用域的时候release 计数器 -1

此时也可以在作用域里面对person retain或release,但是不管怎样,出作用域时计数器只会减y一

}

四.ARC(自动引用计数)

1.ARC会追踪你的对象并决定哪一个仍会使用而哪一个不 会再用到  

• 如果启用了ARC,编译器会自动插入retain和release 语句  

• 通过Xcode启用或禁用可

2.ARC的特点

(1)不允许调用release,retain,retainCount    

(2)允许重写dealloc,但是不允许调用[super dealloc]  

(3)@property的参数:  

  • strong:相当于原来的retain(适用于OC对象),成员变量是强指针  

  • weak:相当于原来的assign,(适用于OC对象类型),成员变量是弱指针  

  • assign:适用于非OC对象类型(基础类型)

相互引用时注意的问题:

1.在一方的.h文件中要导入另一方的头文件,另一方的.h文件要引用@class name

如  #import <Foundation/Foundation.h>

   #import "MicroBlog.h"

   @interface Person : NSObject

   #import <Foundation/Foundation.h>

   @class Person;

   @interface MicroBlog : NSObject

2.一方使用强指针,另一方使用弱指针

3.引用@class的一方若要在.m文件中实现相应的方法,要在.m文件中再次导入另一方的头文件

如  #import "MicroBlog.h"

   #import "Person.h"

   @implementation MicroBlog


ARC实例:

person.h

#import <Foundation/Foundation.h>

#import "MicroBlog.h"


@interface Person : NSObject

@property (nonatomic ,strong)MicroBlog *microBlog;

@property (nonatomic,strong) NSString *name;

@property (nonatomic,weak) NSString *comment;

-(void)printf;

@end


person.m

#import "Person.h"


@implementation Person

-(void)printf

{

    NSLog(@"%@%@发布了第%i条微博,内容是:%@",_name, [_microBlog time],[_microBlog second],[_microBlog content]);

}

@end


microBlog.h


#import <Foundation/Foundation.h>

@class Person;


@interface MicroBlog : NSObject

@property(nonatomic,weak) Person *person;

@property(nonatomic,weak) Person *commentPerson;

@property(nonatomic,weak) NSString *content;

@property(nonatomic,weak) NSString *time;

@property(nonatomic,assign) int second;


-(void)printComment;

@end


microBlog.m

#import "MicroBlog.h"

#import "Person.h"


@implementation MicroBlog

-(void)printComment

{

    NSLog(@"%@评论了你的微博:%@",[_commentPerson name],[_commentPerson comment]);

}

@end


main.m

#import <Foundation/Foundation.h>

#import "MicroBlog.h"

#import "Person.h"


int main(int argc, const char * argv[]) {

    

    Person *person = [[Person alloc]init];

    person.name = @"小明";

    Person *personI = [[Person alloc]init];

    personI.name = @"小花";

    personI.comment = @"👍";

    

    MicroBlog *microBlog = [[MicroBlog alloc]init];

    

    microBlog.content = @"暑假去旅游";

    

    microBlog.second = 2;

    

    NSDate *date = [NSDate date];

    NSDateFormatter *dateformatter = [[NSDateFormatter alloc]init];

    [dateformatter setDateFormat:@"yyyy-MM-dd HH-mm-ss"];

    NSString *nowTime = [dateformatter stringFromDate:date];

    microBlog.time = nowTime;

    

    microBlog.commentPerson = personI;


   //这是容易忘记的一步,要给person对象设置microBlog

    person.microBlog = microBlog;

    

    [person printf];

    [microBlog printComment];

    

 return 0;

}



共有 人打赏支持
粉丝 0
博文 15
码字总数 13635
×
尘埃眠于光年yr
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: