Ed *_*rty 3 initialization objective-c
我在很多地方读过你应该像这样初始化Objective-C对象:
- (id) init {
if (self = [super init]) {
....
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
因为super的init方法可能会从当前返回一个单独的对象self.
现在我正在尝试做这样的事情,而且我不确定我是否正确,相对于保留和释放应该如何工作:
- (id) init:(int)idx {
id obj = [Cache findSelf:idx];
if (obj) {
[self release];
self = [obj retain];
} else {
self = [self doLoad];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
我很好奇,大多如果这是应该做的保留和释放的正确方法self和obj.有没有更好的办法?
你对这个self = [super init]部分是正确的,因为一些Cocoa类确实返回了一个与分配的对象不同的对象.但是,这是例外而不是规则,在您自己的代码中这样做应该是非常罕见或根本不做.虽然拦截-init调用可能很诱人,但是你会违背既定约定以及Objective-C程序员期望代码执行的操作.
这种类型的-init方法通常是一种糟糕的方法,因为-init方法应该尽可能简单,并且应该真正关注初始化对象.我可能会写一个像这样的方便方法:
+ (id) instanceForIndex:(NSUInteger)index {
id obj = [Cache findSelf:index];
if (obj == nil) {
obj = [[self alloc] init];
// Add to cache
}
return [[object retain] autorelease];
}
Run Code Online (Sandbox Code Playgroud)
然后调用此方法而不是-init.这将使-init逻辑更清晰.
另外,我不确定你的Cache类是做什么的,但是值得重新考虑实现,并使用隐藏的静态变量来存储实例(例如,NSMutableDictionary,其中键是从索引创建的NSNumber).这个SO问题可能有用.