无限循环添加子视图

时间:2011-10-18 14:49:28

标签: iphone objective-c ios methods

我有点困惑,经过无数次尝试并阅读了几篇我决定写的文章。 我的问题是,如果你从一个类(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];
    }
}

1 个答案:

答案 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返回的内容分配给您的变量。