【发布时间】:2016-03-01 02:33:04
【问题描述】:
我试图了解以下代码有什么问题。
想象下面的类,“Foo”:
@protocol FooDelegate <NSObject>
- (void)hereTakeThisFooBarDic:(NSDictionary *)fooBarDic;
@end
@interface Foo : NSObject <BarDelegate>
@property (nonatomic, strong) Bar *bar;
@property (nonatomic, weak) id <FooDelegate> *fooDelegate;
- (void)getFooBarDicForNum:(int)fooBarNum;
@end
@implementation Foo
static Foo *foo = nil;
- (id)init {
if (!foo) {
foo = [super init];
self.bar = [[bar alloc] init];
}
return foo;
}
- (void)getFooBarDicForNum:(int)fooBarNum {
self.bar.fooDelegate = self;
[self.bar getFooBarDicFromIntarwebsNumber:fooBarNum];
}
//We get this callback from self.bar after a few ms
- (void)callbackWithFooBarDicFromIntarwebs:(NSDictionary *)fooBarDic {
[self.fooDelegate hereTakeThisFooBarDic:fooBarDic];
}
@end
我们在代码中的某处调用 Foo,如下所示:
for(int i=0; i < 10; i++) {
Foo *foo = [[Foo alloc] init];
[foo getFooBarDicForNum:i];
}
然后我们稍后在 hereTakeThisFooBarDic 方法中获取回调。
但问题是我们正在获得无限的内存增长。看起来 Foo 的 init 方法就像一个单例,但每次我们调用它时,我们都会为它分配更多的内存。但它不会注册为内存泄漏。不过,在查看这段代码时,它似乎不是做单例的正确方法。
我想知道这段代码的作者做错了什么。
【问题讨论】:
-
永远不要创建委托属性
strong。应该是weak。 -
对不起,这只是一个错字。
-
永远不要以
get开头方法名(除非它属于一种有意义的罕见的 Objective-C 约定;这不是)。
标签: objective-c memory singleton