#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
#if 0
//在ARC中,把强引用变成弱引用,将对象=nil就可以
//在ARC中判断的一指针是强引用还是弱引用根据__strong来判断,默认都是强引用
NSArray * arr=[NSArray array];
//相当于,只是省略了__strong
NSArray * __strong array=[NSArray array];
//因为在ARC中默认是有强引用指向
//在MRC下,用Person(arc),在Person中加上:-fobjc-arc.在person中写代码要用arc格式
//如果在ARC下,让Person这个类变成MRC,把Person加上:-fno-objc-arc,在编写代码时,Person这个类下就要用mrc
{
Person * person=[[Person alloc]init];
}
//当person指针出这个作用域的时候,指针会变成弱引用,此时如果没有强引用指向,那么该对象会被销毁
Person * pers=[[Person alloc]init];
pers=nil;
//在ARC中,对象指向nil代表对象那条强引用的线指向nil,如果此时对象没有其他强引用指向,则该对象被销毁
#endif
#if 0
Person * p1=[[Person alloc]init];
NSLog(@"p1=%@",p1);
p1=[[Person alloc]init];//当程序执行到此语句时,上面的p1被销毁,在arc下指向发生改变时,之前指向的线发生改变
p1=nil;
//当程序执行到这句,对象指为nil,程序被销毁
#endif
Person * p1=[[Person alloc]init];
Person * p2=p1;
NSLog(@"%@",p1);
p1=nil;
NSLog(@"%@",p2);
p2=nil;//把强引用变成弱引用
//p1和p2指向的都是同一块地址,p2指向p1指向的地址
}
return 0;
}
#import <Foundation/Foundation.h>
#import "Obj1.h"
#import "Obj0.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
#if 0
Obj0 * obj0=[[Obj0 alloc]init];
Obj1 * obj1=[[Obj1 alloc]init];
[obj0 setOjb1:obj1];
[obj1 setObjo:obj0];
obj0=nil;
obj1=nil;
//此时set方法内部出现了内存泄漏,两个对象互相指向无法释放
//因此需要在set方法内部加上__weak修饰,两个set方法都用__weak修饰
#endif
#if 0
NSObject *__weak obj0=nil;//弱引用指向空,相对来说__weak是安全的
{
NSObject * obj=[[NSObject alloc]init];
//强引用指向一块地址
obj0=obj;
//一个强引用一个弱引用共同指向一块空间
NSLog(@"%@",obj0);
}
//当出obj的作用域时,强引用消失,此时再的印obj0对象为空
NSLog(@"%@",obj0);
//ARC中,指向一块空间的所有强引用消失以后,指针就指向nil
//而在MRC中,当指向一块空间的所有强引用消失以后,指针的指向并不发生改变,此时再向对象发消息程序会崩溃
//在ARC中,一个对象无法将其他对象的指针变成弱引用,只能自己变自己
#endif
#if 0
NSObject * __weak obj=[[NSObject alloc]init];
NSLog(@"obj=%@",obj);
//此时打印出来的对象是null,因为__weak修饰弱引用,创建一个对象后没有指针指向,使用__weak的前提是必须同时有一个强引用指向
#endif
NSObject * __unsafe_unretained obj0=nil;
//IOS4.0以前使用的__unsafe_unretained,用此修饰和MRC是一样的
//__unsae_unretianed 和 __weak的区别是,也都是一条绿线,但是另外一条和他指向同一块地址的红线不存在的时候,用__unsafe_unretained修饰的对象还是指向原来的空间,不会指向nil
{
NSObject * obj1=[[NSObject alloc]init];
obj0=obj1;
NSLog(@"obj0=%p",obj0);
}
NSLog(@"obj0=%p",obj0);
//此时打印的两个地址指向的空间是一样的
NSLog(@"obj0=%@",obj0);
//此时如果打印对象程序会崩溃,因为指针指向的空间里没有obj0这个对象,只不会是obj0的指针向这个空间而已。
}
return 0;
}
//MRC下创建自动释放池的另一种方法
NSAutoreleasePool * pool=[[NSAutoreleasePool alloc]init];
[pool release];
//或者用
[pool drain];
//相当于
@autoreleasepool {
}
#import <Foundation/Foundation.h>
#import "Pig.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
#if 0
Pig * pig=nil;
@autoreleasepool {
pig=[[Pig alloc]init];
NSLog(@"%@",pig);
}
NSLog(@"%@",pig);
//此时程序pig的作用域是外面的pool,开始指向nil,后来变成强引用,再后打印两次,在没有出最外层的pool时都是强引用指向
#endif
}
@autoreleasepool {
Pig * __autoreleasing pig=[[Pig alloc]init];
//用__autoreleasing修饰的对象指针相当于把它们加入自动释放池,当出了离他们最近的自动释放池的时候,对象对被一一销毁
//如果不用__autoreleasing修饰出了自动释放池也会被销毁,但此时的销毁是因为出了对象的作用域
NSLog(@"%@",pig);
}
//__autoreleasing,相当于autorelease经常用于工厂方法的中使用比如
Pig * pig=[Pig pig];
//pig里面实现的是
// {
// Pig * __autoreleasing pig=[[Pig alloc]init];
// return pig;
// }
return 0;
}