我有些困惑,经过无数次尝试并阅读了几篇文章后,我决定写。
我的问题是,如果您从类(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
返回的内容分配给您的变量。