我有一个使用NSURLConnection连接到服务器的连接类。在主类中,我调用此类的类方法,然后类方法分配自身的实例,当收到委托ConnectionDidFinish时,我从内部释放相同的类。这种方法是否正确,否则会导致一些问题。
主类:
[ConnectionClass connectToServer];
连接类:
@implementation ConnectionClass
+(void)connectToServer{
connectionClass = [[ConnectionClass alloc] init];
[connectionClass createConnection];
}
-(void)createConnection{
NSURLConnection *connection = [[NSURLConnection alloc] initWithDelegate:self];
// create asynchronous connection
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
[self release];
}
@end
在自己的方法中释放自我是好的吗?
如果我这样做会怎么样;
主类:
[connectionClass setDelegate:self];
[connectionClass connectToServer];
连接类:
@implementation ConnectionClass
-(void)connectToServer{
[connectionClass createConnection];
}
-(void)createConnection{
NSURLConnection *connection = [[NSURLConnection alloc] initWithDelegate:self];
// create asynchronous connection
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
[self.delegate finishedConnection:self]; // added delegate and then called to the main class and pass the self object for main to release it
}
@end
在主类委托中,我们释放对象
-(void)finishedConnection:(ConnectionClass*)connection
{
[connection release];
}
以这种方式释放对象有什么问题吗?
答案 0 :(得分:2)
[自我释放]& [自我保留]对我来说听起来很疯狂。一切都没有意义恕我直言。 而且我没有看到使(null)connectToServer成为一个类方法的重点!
你的第二种方式是要走的路。你也可以在这两个方面做一步,创建一个方法,如:
[connectionClass connectToServerWithDelegate:self];
答案 1 :(得分:1)
我会这样做:
@implementation ConnectionClass
+ (void)connectToServer {
connectionClass = [[ConnectionClass alloc] init];
[connectionClass createConnection];
[connectionClass release];
}
- (void)createConnection {
[self retain];
NSURLConnection *connection = [[NSURLConnection alloc] initWithDelegate:self];
// create asynchronous connection
[connection release];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[self release];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
[self release];
}
@end
这样ConnectionClass
对象是自我保留的,并且您不会将保留/释放责任放在不紧密相关的不同代码位置。
编辑正如Rabskatran指出的那样,如果你刚刚学习了保留/释放,那么这不是最佳解决方案。
您与代表的第二个示例更好。我让connectionClass
对象是一个实例变量,因此当主类(可能是连接的委托)被解除分配时,您可以通过消息连接对象来取消操作。