#pragma mark 手动管理内存
//影响引用计数改变的方法:
//alloc retain release autorelease dealloc copy mutableCopy
#pragma mark 引用计数增加
//alloc 将引用计数从零变为一;
//retainCount 看引用计数
//将对应的内存引用加一,并返回内存首地址;
Person *per1 = [per retain];
//释放
[per1 release];
//当引用计数为1时,再次releas 不会将引用计数减为0
//而是将内存释放
[per2 retain]; //持有对象;
//自动释放池
@autoreleasepool {
//自动释放 当自动释放池释放时,释放对象;
//只有在自动释放池里面使用autorelease才有效;
[per2 autorelease];
[per2 autorelease];
NSLog(@"%ld",per2.retainCount);
} //自动释放池释放
//不能对常量区的内存进行管理;
NSString 以及常量
//不可变字符串引用计数都是-1,及是整数的最大值;
//内存管理原
一、谁创建,谁释放; alloc release/autorelease
二、是持有,谁释放; retain release/autorelease
四、谁拷贝,谁释放; copy release/autorelease
三、没有retain,alloc,copy就不释放;
//当对象被销毁时,系统自动调用这个方法
-(void)dealloc {
//释放属性的空间,本类
NSLog(@“快释放我");
//先释放本类在释放父类;
[super dealloc]; //释放父类;
[_name release];
}
Person *per2 = [per copy];
@interface Person : NSObject <NSCopying>
浅拷贝
//-(id)copyWithZone:(NSZone *)zone {
// Person *p = [[Person alloc] init];
// p.name = self.name;
// return p;
//}
伪拷贝
//-(id)copyWithZone:(NSZone *)zone {
// return [self retain];
//}
//深拷贝 对象开辟新的空间,两个对象的实例变量也指向不同的空间。
-(id)copyWithZone:(NSZone *)zone {
Person *p = [[Person alloc] init];
// p.name = [[NSString alloc] initWithString:self.name];
p.name = [[NSString alloc] initWithFormat:@"%@",self.name];
return p;
}
#pragma 协议
//以@protocol 开始,以@end结束
/*
@protocol 协议名称 <父协议>
协议方法(标志)
@end
*/
//协议只需要方法的声明,不需要实现;
在.M文件里写实现;
协议与类的融合
//协议格式: <协议名称>
// 遵守协议之后,
//多个协议 用逗号隔开;
@interface Person : NSObject <iOsProgramer, RedPacket>
选择实现;
@optional
默认是必须实现的方法;
@required