Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ios分配释放_Ios_Release_Alloc - Fatal编程技术网

ios分配释放

ios分配释放,ios,release,alloc,Ios,Release,Alloc,我的应用程序收到内存警告,因为它需要大量内存。我试图释放每一个分配。然而,有时我不知道怎么做 例如:我有两对.h和.m文件。其中一个与服务器连接,另一个与本地SQLite连接 通常,从这些文件调用方法的代码如下: -(NSMutableArray *) getRecentActivity{ LocalStorageController *local = [[LocalStorageController alloc]init]; return [local getRecentAct

我的应用程序收到内存警告,因为它需要大量内存。我试图释放每一个分配。然而,有时我不知道怎么做

例如:我有两对.h和.m文件。其中一个与服务器连接,另一个与本地SQLite连接

通常,从这些文件调用方法的代码如下:

-(NSMutableArray *) getRecentActivity{
    LocalStorageController *local = [[LocalStorageController alloc]init];
    return [local getRecentActivity];
}
getRecentActivity返回NSMutableArray

在这段代码中,我们可以看到我正在为LocalStorageController分配内存,但我从未调用release方法,因此,我想,我调用该函数越多,分配的内存就越多

如果我在init之后调用autorelease,它将崩溃

此外,我通常使用另一种代码:

    ServerConnection *serv = [[ServerConnection alloc]init];
    NSMutableArray list = [serv getMyListOfContacts];
它使用一个HttpRequest,如果我调用[serv release];第二行之后,应用程序崩溃,EXC_BAD_访问指向ASIHTTPRequest库中的一行

我们该如何处理这种情况


多谢各位

第一例容易

-(NSMutableArray *) getRecentActivity{
    LocalStorageController *local = [[LocalStorageController alloc]init];
    NSMutableArray *tmp = [local getRecentActivity];
    [local release];
    return tmp;
}

第二种情况是,如果不看到更多的实际代码,就很难用一般方法解决。

使用serv作为属性将解决这个保留/释放问题

在您的.h中:

@property (nonatomic, retain) ServerConnection *server;
在您的.m中:

@synthesize server;

- (void)dealloc {
    [server release];
    // The rest of your releases here...
    [super dealloc];
}

- (void)yourMethod {
    ServerConnection *myServConnection = [[ServerConnection alloc] init];
    self.serv = myServConnection;
    [myServConnection release];
    NSMutableArray list = [self.serv getMyListOfContacts];
}

只要从那时起继续在这个类中使用self.serv,就不会有发布对象的问题。

我只是简单地展示了发布代码的方向,但你是对的。我更新了我的答案。谢谢你指出这一点!再次编辑它,你应该把呼叫超级dealoc放在底部。首先,谢谢你的回答。我意识到我的示例是错误的:似乎我无法发布它,因为我正在异步使用ASIHTTPRequest,所以它需要在那里等待委托。如果我这样做,它会再次崩溃。。。那么,你现在该怎么做呢?把它作为一个属性使用,但在你的-idinit函数中初始化它。我这么说了,但它会导致同样的错误。我认为,由于答案可能会在几秒钟后到达,如果我释放服务器,它将无法处理响应,因为释放是第一位的,因此ASIHTTPRequest无法调用已释放的委托。我不知道我是否解释得很好。。。但如果我这样做,它会崩溃,如果我什么也不做,它会保留在内存中,不是吗?你也会希望在tmp上保留一个,然后自动返回它。除非您这样做,否则您不能假设tmp在[local release]之后是有效的。