Как сохранить работу в Objective-C? - PullRequest
0 голосов
/ 23 апреля 2011

У меня есть этот код.

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    if ([elementName isEqualToString:@"stat"]) {
        currentKey = [attributeDict objectForKey:@"name"];
        currentValue = [[[NSMutableString alloc] init] autorelease];
    }  
}

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    [currentValue appendFormat:string];
}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    if ([currentKey isEqualToString:@"url"])
        self.urlToServerLog = currentValue;
}

И заголовочный файл

    @interface HDEAppDelegate : NSObject <NSApplicationDelegate, NSXMLParserDelegate> {
@private
    NSWindow *window;
    NSString* scratchFolder;
    NSMutableString *urlToServerLog;
    NSString *currentKey;
    NSMutableString *currentValue;
}

@property (assign) IBOutlet NSWindow *window;
@property (assign) IBOutlet NSTextField *output;
@property (assign) IBOutlet NSTextField *matchID;
@property (retain) NSString *scratchFolder;
@property (retain) NSMutableString *urlToServerLog;

-(IBAction) ParserButton:(id)sender;
-(NSFileWrapper*)unzip:(NSData*)zipData;

@end

Проблема здесь в том, что объект в urlToServerLog / currentValue удаляется.

Я нашел решение - скопировать объект, но мое оригинальное решение остается в силе. Почему не сохраняет работу в этом случае?

Кстати: scratchFolder также используется с объектом автоматического выпуска, и он работает отлично (используя точно такой же способ, вернитесь из NSString (autorelease) и назначьте для scratchFolder.

Ответы [ 2 ]

1 голос
/ 23 апреля 2011

В -parser:didStartElement:namespaceURI:qualifiedName:attributes: вы выделяете новую строку и автоматически освобождаете ее:

currentValue = [[[NSMutableString alloc] init] autorelease];

Это означает, что эта строка будет освобождена при сливе соответствующего пула автоматического выпуска.В общем, если объект должен оставаться в живых после завершения выполнения метода, вам необходимо владеть им.В вашем случае не выпускайте его автоматически в этот момент (и не забывайте выпускать его, когда он вам больше не нужен), или задайте свойство currentValue a retain и используйте вместо него self.currentValue = ….

Еще один момент, на который следует обратить внимание: вы, вероятно, захотите сделать свойство urlToServerLog copy вместо retain, потому что currentValue, будучи изменяемой строкой, будет изменяться во время выполнения синтаксического анализатора XML.Если вы используете retain, ваше свойство urlToServerLog также изменится, поскольку оно указывает на ту же изменяемую строку.Изменяя свойство на copy, вы фактически создаете копию currentValue - любые дальнейшие изменения в currentValue не влияют на это свойство.

1 голос
/ 23 апреля 2011

currentValue освобождается, когда didStartElement: заканчивается.Я предполагаю, currentValue является переменной класса?Какое значение вы видите для urlToServerLog после присвоения ему currentValue?

...