一.复习内存管理中的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;
}
【2015-10-19】内存管理---深浅拷贝,autorelease,ARC(自动引用计数)
原文:http://my.oschina.net/u/2483162/blog/519021