编辑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];
...
}
答案 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时记录 - 然后查看我的怀疑是否正确。