动态实现对象

时间:2011-07-19 10:42:29

标签: iphone nsurlconnection

我有一个使用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];
 }

以这种方式释放对象有什么问题吗?

2 个答案:

答案 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对象是一个实例变量,因此当主类(可能是连接的委托)被解除分配时,您可以通过消息连接对象来取消操作。