我有点困惑,经过无数次尝试并阅读了几篇我决定写的文章。 我的问题是,如果你从一个类(xml)调用一个方法,它的目标是viewcontroller一切顺利 但是如果我可以添加[self.view add ...]它会重新加载到viewController类的viewDidLoad,进入无限循环。
这就是我的工作
class(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];
}
}
答案 0 :(得分:3)
- (void) parserDidEndDocument:(NSXMLParser *)parser {
classViewController *skiSpeedC = [classViewController alloc];
[skiSpeedC riceviDic:datiMeteo];
}
您每次都在创建classViewController
的新实例。你的“xml”类(XMLStuff?)应该有一个指向视图控制器的指针,并在该实例上调用riceviDic
方法。
你得到一个无限循环,因为当你在viewDidLoad中分配XML对象时,它也开始解析XML,然后创建更多的XML对象,然后创建更多的viewControllers ......
因此,将属性添加到classView类型的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
返回的内容分配给您的变量。