【问题标题】:iPhone NSMutableArray release problemiPhone NSMutableArray 发布问题
【发布时间】:2010-12-17 09:54:42
【问题描述】:

我有两个控制器,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]; 在三个地方),应用程序都会崩溃。

有什么建议吗?谢谢。

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    尝试

    if ([delegate respondsToSelector:@selector(urlHandler:listObjectsFinishedLoading:)]) {
      [delegate urlHandler:self listObjectsFinishedLoading:[objects autorelease]];
    }
    

    【讨论】:

    【解决方案2】:

    也许您在- (void)parserDidEndDocument:(NSXMLParser *)parser- (void)dealloc 再次释放对象。释放对象的时候尽量把对象设为nil(≠NULL),这样就知道不会再被释放了。

    - (void)parserDidEndDocument:(NSXMLParser *)parser
    {
       [objects release], objects = nil;
    }
    

    【讨论】:

      【解决方案3】:
      -(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];
      }
      

      以这种方式使用它绝对有效。

      【讨论】:

        【解决方案4】:

        您将objects 定义为保留属性,然后直接寻址实例变量。如果你使用 synthesize 来生成 getter 和 setter,那么让它们为你做内存管理。

        self.objects = [[[NSMutableArray alloc] init] autorelease];

        self.objects = nil;

        而不是手动进行发布。

        【讨论】:

          【解决方案5】:

          感谢您的帮助。仍然不起作用,但我觉得问题可能出在 Object 类中。释放数组调用每个对象的释放对吗?

          对象.h

          @interface Object : NSObject {
              NSString *name;
          }
          @property (nonatomic, retain) NSString *name;
          

          对象.m

          -(void) dealloc{
          
            [self.name release]; 
            [super dealloc];
          }
          

          如果我评论 [self.name release];行,然后可以释放有问题的阵列,它不会崩溃,也没有泄漏。但随后应用程序在使用 Object name 属性的其他地方泄漏了 NSStrings。

          这可能是我想念的非常微不足道的事情。

          谢谢。

          【讨论】:

          • 您在哪里分配 Object 的“名称”属性?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-19
          • 1970-01-01
          • 2010-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多