[英]iphone: problem in NSMutableArray and NSMutableDictionary
[英]iPhone NSMutableArray release problem
我有兩個控制器,SyncController和XMLController。 SyncController將一些參數發送到XMLController,XMLController連接到API,並將結果包裝為NSMutableArray中的對象,然后將數組返回給SyncController。
一些代碼:
SyncController.h
-(void)urlHandler:(NSArray *)urlHandler listObjectsFinishedLoading:(NSMutableArray *)resultData;
SyncController.m
- (void)urlHandler:(NSArray *)urlHandler listObjectsFinishedLoading:(NSMutableArray *)resultData;
{
NSMutableArray *receivedObjects = [[NSMutableArray alloc] init];
[receivedObjects addObjectsFromArray:resultData];
for (Object *o in receivedObjects) {
//DO SOME STUFF
}
[receivedObjects release];
}
XMLController.h
@interface XMLController : NSObject {
NSMutableArray *objects;
}
@property (nonatomic, retain) NSMutableArray *objects;
XMLController.m
-(void) connectionDidFinishLoading:(NSURLConnection *) connection {
objects = [[NSMutableArray alloc] init];
if ([delegate respondsToSelector:@selector(urlHandler:listObjectsFinishedLoading:)]) {
[delegate urlHandler:self listObjectsFinishedLoading:objects];
}
//[objects release];
}
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
// Initialize an Object
}
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
{
// Put some properties unto Object
// Ad Object to the objects array
// release Object
}
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
//[objects release];
}
- (void)dealloc {
//[objects release];
[super dealloc];
}
我的問題是,如何正確釋放對象數組? 如果我不釋放它,代碼將正常運行(// DO SOME STUFF中的操作已執行),但顯然會泄漏。 如果我釋放它,無論我在哪里執行(請查看注釋的/// [objects release];在三個地方),應用程序都會崩潰。
有什么建議么? 謝謝。
嘗試
if ([delegate respondsToSelector:@selector(urlHandler:listObjectsFinishedLoading:)]) {
[delegate urlHandler:self listObjectsFinishedLoading:[objects autorelease]];
}
也許您要在- (void)parserDidEndDocument:(NSXMLParser *)parser
重新分配對象,然后在- (void)dealloc
重新分配對象。 嘗試在釋放對象時將其設置為nil(≠NULL),這樣就知道它不會再次釋放。
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
[objects release], objects = nil;
}
-(void) connectionDidFinishLoading:(NSURLConnection *) connection {
NSMutableArray *temp=[[NSMutableArray alloc] init];
self.objects=temp;
[temp release];
if ([delegate respondsToSelector:@selector(urlHandler:listObjectsFinishedLoading:)]) {
[delegate urlHandler:self listObjectsFinishedLoading:objects];
}
//[objects release];
}
and then
- (void)dealloc {
//[objects release];
[self.objects release];
[super dealloc];
}
以這種方式使用肯定有效。
您正在將objects
定義為保留屬性,然后直接處理實例變量。 如果使用synthesize生成getter和setter,則讓它們為您執行內存管理。
self.objects = [[[NSMutableArray alloc] init] autorelease];
和
self.objects = nil;
而不是手動進行發布。
謝謝你的幫助。 仍然不起作用,但是我感覺到問題可能出在Object類中。 釋放對每個對象釋放的數組調用吧?
對象
@interface Object : NSObject {
NSString *name;
}
@property (nonatomic, retain) NSString *name;
對象
-(void) dealloc{
[self.name release];
[super dealloc];
}
如果我評論[self.name版本]; 行,然后可以釋放有問題的陣列,它不會崩潰,也不會泄漏。 但是隨后,該應用程序在使用“對象名稱”屬性的其他地方泄漏了NSString。
我想念的東西可能很瑣碎。
謝謝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.