内存问题体现在两个方面: 内存溢出,野指针异常
内存管理的方式: 垃圾回收( gc)
MRC
人工引用计数(Manual Reference Count)
ARC
自动引用计数(Auto Reference Count)
堆内存只有正在使用和销毁两种状态
影响引用计数的方法:
+alloc (开辟, 0 -> 1)
retain
( + 1)
copy
release
autorelease
dealloc(继承自父类的方法)
[pool release] 释放池子
[pool drain] 池子清道
当自动释放池释放或者清道的时候
autorelease的对象释放。
对空指针进行任何操作都无意义
-跟retain不同,⼀一个对象想要copy,⽣生成⾃自⼰己的副本,需要实现 NSCopying协议,定义copy的细节(如何copy)。如果类没有接 受NSCopying协议⽽而给对象发送copy消息,会引起crash。
@implementation Person
- (id)copyWithZone:(NSZone *)zone{
Person *p = [[Person allocWithZone:zone]init];
p.age = self.age;
p.name = self.name;
return p;
}
@property(nonatomic,assign)NSString *name;
- (void)setName:(NSString *)name{
_name = name; }
- (NSString *)name{
return _name; }
@property(nonatomic,retain)NSString *name;
- (void)setName:(NSString *)name{
if(_name != name){ [_name release]; _name = [name retain];
} }
-(NSString *)name{
return [[_name retain]autorelease];
}
-(id)initWithName : ( NSString *)name
{
self = [super init];
if (self) {
self.name = name;
}
return self;
}
- (void)setName:(NSString *)name
{
if(_name != name)
{
[_name release];
_name = [name copy];
}
}
- (NSString *)name{
return [[_name retain]autorelease];
}
set 和get 方法只能重写一个。
内存泄露
dealloc
永远不要手动调用dealloc , dealloc 的最后一行必须要写[super dealloc].
便利构造器:
return[p autorelease]
collection : 加入的对象自动retain , 移除的对象自动release ,本身释放时,对内部所有的对象release 。
http://blog.csdn.net/jobtong/article/details/8453434
http://blog.csdn.net/chenzhiqin20/article/details/8497419http://www.douban.com/note/210192618/
NSString * str = [NSString stringWithFormat:@"asfpngyuipng"];
if ([str rangeOfString:@"png"].length > 0) {
str = [str stringByReplacingOccurrencesOfString:@"png" withString:@""];
}
NSLog(@"%@",str);
创建对象时,对象的内存分配在堆区,指向对象的指针分配在栈区,堆区内存需要程序员手动申请和释放。
oc只允许单继承,解决多继承的方法是协议。(协议和代理)