2019独角兽企业重金招聘Python工程师标准>>>
1,谁拥有,谁释放
如何拥有:alloc,copy,retain
如何释放:release,autorelease
2,performSelector:withObject:afterDelay 这方法很容易搞出内存泄露,小心一点
如何避免:
(1)使用前先检测一下,
SEL testSelector = @selector(test:);
if([tester respondsToSelector:testSelector]) {
[tester test:@"invoke test method"];
}
(2)使用后
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(test:) object:nil]
3,deleagate属性用用assign来修饰占有权.
4,内存管理好习惯
(1)使用属性访问尽可能多的来代替变量来减少retain和release的代码,举例:
@interface Counter: NSObject{
NSNumber *_count;
}
@property (nonatomic, retain) NSNumber *count;
//“get”访问方法:
- (NSNumber *)count{
return _count;
}
//“set”访问方法:
- (void)SetCount: (NSNumber *)newCount{
[newCount retain];
[_count release];
_count = newCount; //Make the new assignment;
}
(2)使用setProperty给属性赋值,举例
-(void)reset{
NSNumber *zero = [NSNumber numberWithInteger:0];
[self setCount:zero];
}
不要这么搞:
-(void)reset{
NSNumber *zero = [[NSNumber alloc] initWithInteger:0];
[_count release];
_count = zero;
}
不要这么搞的原因:代码多了,KVO不起作用了
(3)初始化和销毁的时候不要用访问方法,直接用变量。举例:
初始化1:
- init {
self = [super init];
if (self) {
_count = [[NSNumber alloc] initWithInteger:0];
}
return self;
}
初始化2:
- initWithCount:(NSNumber *)startingCount {
self = [super init];
if (self) {
_count = [startingCount copy];
}
return self;
}
销毁:
- (void)dealloc {
[_count release];
[super dealloc];
}
(4)用weak来避免循环调用,table data sources ,outline view items,noification observers,targets and delegates
(5)避免销毁正在使用的对象,举例:
heisenObject = [array objectAtIndex:n];
[array removeObjectAtIndex:n]; //heisenObject从此被销毁了,需要retain一下下
变成下面的就好了:
hesienObject = [[array objectAtIndex: n] retain];
[array removeObjectAtIndex:n];
[hesienObject release];
(6)不要指望在deallocate里面去销毁重量级资源,请您写专门的cleanup方法来做。
重量级资源:file descriptors, network connections, buffers,caches 等
(7)Collections自带retain,release无须手动添加多此一举
抄袭:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447