Objective_C_09
15/12/16
// Objective_C_09
.m
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
// int i = 0;
// while (YES) {
// NSLog(@"%d",i);
// i++;
// }
/*
1.alloc影响一个对象从无到有的过程,使引用计数从0到1
2.retain:只要对象接受retain消息,该对象的引用计数加1
*该方法返回的还是本对象
3.copy:将原来对象进行拷贝,原对象的引用计数不变,新的对象引用计数为1,这个方法的返回的是新的对象
4.release:只给对象对应的内存空间引用计数减1
*/
// Person *person = [[Person alloc] initWithName:@"小金刚" Age:45];
// [person retain];
// [person retain];
//// [person retain];
// NSLog(@"person的引用计数是:%lu\n",[person retainCount]);
// Person *person1 = [[Person alloc] initWithName:@"sdtgs" Age:420];
// person1 = person;
// NSLog(@"person1的引用计数是:%lu\n",[person1 retainCount]);
// [person1 release];
// NSLog(@"person的引用计数是:%lu",[person retainCount]);
// NSLog(@"person1的引用计数是:%lu\n",[person1 retainCount]);
// [person release];
// NSLog(@"person的引用计数是:%lu",[person retainCount]);
// NSLog(@"person1的引用计数是:%lu\n",[person1 retainCount]);
// [person release];
// NSLog(@"person的引用计数是:%lu",[person retainCount]);
// NSLog(@"person1的引用计数是:%lu\n",[person1 retainCount]);
// [person release];//过度释放,就会崩溃
// person = nil;//指针置空
// person1 = nil;
// NSLog(@"%@",person.name);
// NSLog(@"%@",person1.name);
// retainCount只是调用显示,没有将指针置空的时候,虽然retainCount是0,但是显示的还是1
// NSLog(@"person的引用计数是:%lu",[person retainCount]);
// NSLog(@"person1的引用计数是:%lu",[person1 retainCount]);
/*OC当中采用引用计数,当一个指针指向一块内存的时候,这块内存的引用计数就加1,当一个指针被去掉的时候,这块内存的引用计数就减1.(当引用计数为1还要对他进行release的时候),就回收这块内存,但是内存的内容不变,即引用计数依旧为1*/
// copy 遵守NSopying协议并实现cipyWithZone的方法才能使用,此时原对象指向的内存空间引用计数不变,新对象引用计数为1
// Person *per = [[Person alloc] init];//per 1
// per.name= @"tutu";
// per.age = 15;
// NSLog(@"per的retainCount:%lu",[per retainCount]);
// NSLog(@"%@",per.name);
// Person *per1 = [per copy];
// [per1 retain];
// [per release];
//// per = nil;
//// per1 = nil;
//// [per1 retain];
// NSLog(@"per1的retainCount: %lu",[per1 retainCount]);
//// NSLog(@"per的retainCount: %lu",[per retainCount]);
// NSLog(@"%@",per1.name);
// @autoreleasepool内部实例的对象不能在@autoreleasepool外部使用
// @autoreleasepool {
//
// Person *pep = [[Person alloc] init];// 1
// pep.name = @"zhaogao";
// [pep retain];// 2
// [pep release];
// [pep autorelease];//
// NSLog(@"+++++%lu",[pep retainCount]);
// Person *p1 = [[Person alloc] init];
// p1.name = @"lilianyin";
// [p1 autorelease];
// NSLog(@"****%lu",[p1 retainCount]);//autorelease出现在了两者之间,pool就会把接收 autorelease 的对象给保存起来(以栈的方式,把对象压入栈)
// Person *pp2 = [[Person alloc] init];
// pp2.name = @"shijie";
// [pp2 autorelease];
// NSLog(@"****%lu",[pp2 retainCount]);
// }
// @autoreleasepool {
// Person *pee = [[Person alloc] init];
// pee.name = @"实验 ";
// [pee retain];
// NSLog(@"ssss %lu",[pee retainCount]);
// [pee release];
// [pee autorelease];
// NSLog(@"ssss %lu",[pee retainCount]);
// }
// @autoreleasepool {
// for (int i = 0; i < 100000; i++) {
// Person *psd = [[Person alloc] init];
// psd.name = [NSString stringWithFormat:@"famgfamg"];
// NSLog(@"%@",psd.name);
// NSLog(@"%d",i);
// [psd autorelease];
// }
// }
// 便利构造器:内部 alloc...autorelease,在没有出现释放池的时候,在不断的分配内存,直到内存不够用就崩溃掉, autorelease 不会立即释放,未来某一时刻释放
// @autoreleasepool {
// for (int i = 0; i < 100; i++) {
// Person *psd = [[Person alloc] init];
// psd.name = [NSString stringWithFormat:@"famgfamg"];
// NSLog(@"%@",psd.name);
// NSLog(@"%d",i);
// [psd autorelease];
// }
// Person *p0 = [[Person alloc] init];
// p0.name = @"dream";
// [p0 autorelease];
// [p0 release];
// p0.name = @"hehe";
// Person *pz = p0;
// NSLog(@"%@",pz);
// NSLog(@"%@",p0.name);
// Person *sd = [Person personWithName:@"-lubu-" Age:45];
//// [sd retain];
// [sd autorelease];
// NSLog(@"%@ %lu",sd.name,[sd retainCount]);
// }
// Person *sd = [Person personWithName:@"-lubu-" Age:45];
//// [sd retain];
//// [sd release];
// NSLog(@"%@ %lu",sd.name,[sd retainCount]);
return 0;
}
Persom.h
#import <Foundation/Foundation.h>
@interface Person : NSObject<NSCopying>
@property (nonatomic,retain)NSString *name;
@property (nonatomic,assign)NSInteger age;
- (instancetype)initWithName:(NSString *)name
Age:(NSInteger)age;
+ (instancetype)personWithName:(NSString *)name
Age:(NSInteger)age;
@end
Person.m
#import "Person.h"
@implementation Person
@synthesize name = _name,age = _age;
- (instancetype)initWithName:(NSString *)name
Age:(NSInteger)age{
if ([super init]) {
_name = name;
_age = age;
}
return self;
}
+ (instancetype)personWithName:(NSString *)name
Age:(NSInteger)age{
Person *p = [[Person alloc] initWithName:name Age:age];
return p;
}
- (void)dealloc{
NSLog(@"%@被销毁了",self.name);
[super dealloc];
}
- (instancetype)copyWithZone:(NSZone *)zone{
Person *p = [[Person allocWithZone:zone] init];
p.name = _name;
p.age = _age;
return p;
}
@end

浙公网安备 33010602011771号