scrollViewDidEndDecelerating提供了比awakeFromNib更多的AppDelegate指针

时间:2012-07-30 23:36:45

标签: iphone ios xcode uiwebview delegates

编辑2

我发现它取决于使用的方法。当我通过scrollViewDidEndDecelerating而不是awakeFromNib访问它时,我以某种方式丢失了appdelegate指针。但我确实需要使用scrollViewDidEndDecelerating。 有人可以解决这个问题吗?

工作正常

- (void)awakeFromNib
{
AppDelegate *mainDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSLog(@"%@", [NSString stringWithFormat:@"%@", mainDelegate.content1]);
}

将bad_access崩溃至mainDelegate.content1

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
AppDelegate *mainDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSLog(@"%@", [NSString stringWithFormat:@"%@", mainDelegate.content1]);
}

原始问题(我将此保留为过去参考。只需阅读上述功能)

此问题涉及stringWithContentsOfURL

下面的代码可以工作,将HTMLstring下载到mainDelegate.content1并在UIWebView controller.myWebView中正确显示。如果我修改了这个函数,以便我事先进行下载过程,让它在AppDelegate.m中的某个地方,程序会在这个函数中处理mainDelegate.content1时崩溃。

这是好的代码

- (void)ReloadView:(int)page{

MyViewController *controller = [viewControllers objectAtIndex:pageControl.currentPage];

mainDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

NSError * error;
NSURL * Tmpurl;
NSString *tmpContent;
NSString *urlAddress;

urlAddress = mainDelegate.TitleStrP1;
Tmpurl = [NSURL URLWithString:urlAddress];
tmpContent = [NSString stringWithContentsOfURL:Tmpurl encoding:NSUTF8StringEncoding error:&error];

maindelegate.content1 = [NSString stringWithString:tmpContent];

[controller.myWebView loadHTMLString:mainDelegate.content1 baseURL:nil]; 
}

这就是我想做的事情,什么是行不通的。 SomeFunction在启动应用程序时执行。我将HTMLstring从Internet站点下载到content1后检查了加载的值,并确实存在html代码。

- (void)ReloadView:(int)page{
MyViewController *controller = [viewControllers objectAtIndex:pageControl.currentPage];
mainDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

//code had been removed here

[controller.myWebView loadHTMLString:mainDelegate.content1 baseURL:nil]; 
}

-(void)SomeFunction{
NSError * error;
NSURL * Tmpurl;
NSString *tmpContent;
NSString *urlAddress;

urlAddress = mainDelegate.TitleStrP1;
Tmpurl = [NSURL URLWithString:urlAddress];
tmpContent = [NSString stringWithContentsOfURL:Tmpurl encoding:NSUTF8StringEncoding error:&error];

maindelegate.content1 = [NSString stringWithString:tmpContent];
}

感谢您的帮助。 感谢

编辑:

AppDelegate.h

#import <UIKit/UIKit.h>

@class ContentController,MyViewController;

@interface AppDelegate : NSObject <UIApplicationDelegate>
{
    ...
    NSString *content1;
    NSString *content2;
}

...
@property (nonatomic, strong) NSString * content1;
@property (nonatomic, strong) NSString * content2;

AppDelegate.m

    - (void)applicationDidFinishLaunching:(UIApplication *)application
{
    content1 = [NSString stringWithString:@""];
    content2 = [NSString stringWithString:@""];

NSError * error;
NSURL * Tmpurl;
NSString *tmpContent;
NSString *urlAddress;

urlAddress = TitleStrP1;
Tmpurl = [NSURL URLWithString:urlAddress];
tmpContent = [NSString stringWithContentsOfURL:Tmpurl encoding:NSUTF8StringEncoding error:&error];
content1 = [NSString stringWithString:tmpContent];

urlAddress = TitleStrP2;
Tmpurl = [NSURL URLWithString:urlAddress];
tmpContent = [NSString stringWithContentsOfURL:Tmpurl encoding:NSUTF8StringEncoding error:&error];
content2 = [NSString stringWithString:tmpContent];
...
}

1 个答案:

答案 0 :(得分:0)

appDelegate中的“Content1”属性是否使用“strong”?此外,要使用属性,您应该使用较低的类,因为setter需要大写变量名称(setContent1)。那是

@property (nonatomic, strong) NSString *content1;

编辑:

[[UIApplication sharedApplication]委托]将始终有效。糟糕的是,你没有说是否存在价值(也就是说,它是否为零)。所以其中一个正在发生。

1)你的AppDelegate对象被释放并解除分配。我不确定你会怎么做,但它可能。

2)你已经告诉UIApplication在main.m中创建一个委托,在“UIApplicationMain()”的第四个参数中,但是也在.plist文件中指定了一个NIB,并且该nib还有一个AppDelegate对象并作为代表连接到UIApplication。如果您正在使用NIB,AppDelegate的属性属性最好是STRONG,因为UIApplication没有保留它(它在UIApplication的delegate属性中说明了这一点)。

3)如果“delegate”属性为nil,则有人将其设置为nil。

考虑一下 - UIApplication委托很早就设置好了,否则你永远不会得到启动的消息。

因此,您需要向应用委托添加“dealloc”方法,并在发生这种情况时进行记录。您还可以添加一个简单的“init”方法,该方法也会在创建AppDelegate时记录 - 然后查看我的怀疑是否正确。