我有些困惑,经过无数次尝试并阅读了几篇文章后,我决定写。
我的问题是,如果您从类(xml)调用方法,并且该方法针对的是Viewcontroller,那么一切都会顺利进行
但是,如果我可能将[self.view add ...]添加到顶部,则重新加载viewController类的viewDidLoad,从而进入一个无限循环。

这就是我所做的

类(ViewController)
。H

#import <UIKit/UIKit.h>

@class  XMLStuff;

@interface skiSpeedViewController : UIViewController {
}

@property (nonatomic, retain) XMLStuff *xml;

.m
- (void)viewDidLoad
{
    [super viewDidLoad];

    xml.skiSpeedC = self;

    GpsStuff *gps = [GpsStuff alloc];
    [gps init];
}

gps.m
- (id)init
{
    self = [super init];
    if (self) {
        xml = [XMLStuff alloc];
}
}
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
     [xml lon:newLocation.coordinate.longitude lat:newLocation.coordinate.latitude];

xml.h
#import "skiSpeedViewController.h"

@class skiSpeedViewController;

@interface XMLStuff : NSObject <NSXMLParserDelegate> {
}

@property (retain, nonatomic) skiSpeedViewController *skiSpeedC;

.m
   @synthesize skiSpeedC;

- (void) parserDidEndDocument:(NSXMLParser *)parser {
NSLog(@"--%@", self.skiSpeedC); // Return (null)
[self.skiSpeedC riceviDic:datiMeteo];
}

ViewController.m
    -(void)riceviDic:(NSMutableDictionary *)dictMeteo {
        datiMeteo = [[NSMutableDictionary alloc]initWithDictionary:dictMeteo];
    }
}

最佳答案

- (void) parserDidEndDocument:(NSXMLParser *)parser {
    classViewController *skiSpeedC = [classViewController alloc];
    [skiSpeedC riceviDic:datiMeteo];
}

您每次都在创建一个新的classViewController实例。您的“xml”类(XMLStuff?)应该具有指向视图控制器的指针,并在该实例上调用riceviDic方法。

之所以会出现无限循环,是因为当您在viewDidLoad中分配XML对象时,它也开始解析XML,然后创建更多XML对象,然后再创建更多viewControllers ...

因此,将一个属性添加到classViewController类型的XMLStuff中,并在viewDidLoad中创建它时:
xml.skiSpeedC = self;

然后,在parserDidEndDocument中:
- (void) parserDidEndDocument:(NSXMLParser *)parser {
    [self.skiSpeedC riceviDic:datiMeteo];
}

更新

好的,在您进行编辑之后,外观看起来非常不同-您似乎引入了一个新类-GpsStuff,它具有自己的XMLStuff实例(还有一个看上去很晦涩的init方法,我认为您没有正确地复制它?)。哪一个实际上是在解析您的文档?您的视图控制器或GPSStufF中的XMLStuff?我猜在GPSStuff中,您尚未设置skiSpeedC属性。以前,我假设您正在从视图控制器调用所有内容。

为什么不从GPSStuff中删除新的XMLStuff对象的创建,并在视图控制器中创建GPSStuff时,将已创建的xml对象传递给它:
- (void)viewDidLoad
{
    [super viewDidLoad];

    GpsStuff *gps = [[GpsStuff alloc] init];
    XMLStuff *xml = [[XMLStuff alloc] init];
    xml.skiSpeedC = self;
    gps.xml = xml;
    [xml release];
}

另外,skiSpeedC属性可能不应该是retain,因为它本质上是委托分配,并且在释放xml解析器之前不会释放视图控制器。

注意,按照惯例,您应该像这样初始化对象:
GPSStuff *gps = [[GPSStuff alloc] init];

不在两行上。您希望将init返回的内容分配给您的变量。

07-24 09:29