【问题标题】:Received memory warning when loading uibweview加载 uibweview 时收到内存警告
【发布时间】:2014-01-09 00:59:30
【问题描述】:

我有一种方法可以在 UIWebview 中加载一些 youtube 视频,并且我有很多视频,当我运行代码时,我收到 收到内存警告,并且应用程序崩溃了。我尝试使用did received memory waring 修复它,但它不起作用这是我正在使用的方法:-

-(void) setScrollView:(UIScrollView *)scrollview :(NSArray *)contentArray{

int x=0;

for(NSDictionary *str in contentArray){

    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(x, 0, 123, 123)];

    webView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;

    webView.scrollView.scrollEnabled = NO;

    webView.scrollView.bounces = NO;

    NSString *link = [str objectForKey:@"UTUBEURL"];

    link = [@"http://www.youtube.com/v/" stringByAppendingFormat:link];

    NSLog(@"link = %@",link);


    NSString *embedHTML = @"\
    <html><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0  \">\
    <style type=\"text/css\">\
    body {\
    background-color: transparent;\
    color: white;\
    }\
    </style>\
    </head><body width=\"%0.0f\" height=\"%0.0f\" style=\"margin:0\">\
    <embed id=\"yt\" src=\"%@\" type=\"application/x-shockwave-flash\" \
    width=\"%0.0f\" height=\"%0.0f\" autostart=\"true\"></embed>\
    </body></html>";

    NSString* html = [NSString stringWithFormat:embedHTML,webView.frame.size.width, webView.frame.size.height,link, webView.frame.size.width, webView.frame.size.height];


    [webView loadHTMLString:html baseURL:nil];


    UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(x,123,200,20)];

    [title setFont:[UIFont systemFontOfSize:11]];
    [title setBackgroundColor:[UIColor blackColor]];
    [title setTextColor:[UIColor whiteColor]];
    title.text = [NSString stringWithFormat:@" %@",[str objectForKey:@"DISPLAYTEXT"]];

    x += webView.frame.size.width+2;


    [scrollview addSubview:webView];
    [scrollview addSubview:title];

}

scrollview.contentSize = CGSizeMake(x, scrollview.frame.size.height);
}

我在这里有大约 50 个视频,所以我可以做些什么来避免这种情况,我在我的 viewDidLoad 中调用此方法。有没有办法使用线程更好地做到这一点,有人可以帮助我吗?但我对 ios 上的线程一无所知。

【问题讨论】:

  • 分配大量的uiwebview是相当昂贵的
  • 为什么要创建 50 个 Webview??,创建一个 WebView 并替换仅在该 WebView 上播放的 url,它与您的要求不同吗?
  • 您可以使用滑动手势来更改要在该 Webview 上播放的视频,并根据它替换您的 UILabel。
  • @mAc 是的,它与我的请求不同,我想在我的主屏幕上添加一组视频,当用户按下播放按钮时,视频应该像视频库一样播放
  • 创建您自己的播放器控件,但不是 web 视图

标签: ios iphone ios5 uiwebview didreceivememorywarning


【解决方案1】:

我不能为你写完整的代码,但给你一小段代码来帮助你。

您制作一个滚动视图,其中包含要播放的视频的缩略图,然后将网址分别保存在一个数组中

**In VideoPlayContoller.h**

#import <MediaPlayer/MediaPlayer.h>
@interface VideoPlayViewController : UIViewController{

    MPMoviePlayerController *moviePlayerController;

}

@property (nonatomic, readwrite) int i;
@property (nonatomic, retain) NSMutableArray *allVideoUrls;

-(void)playVideo:(int)_index;

- (IBAction)onTapBack:(id)sender;

@end

**In VideoPlayContoller.m**

#import "VideoPlayViewController.h"
#import <MediaPlayer/MediaPlayer.h>

@implementation VideoPlayViewController

@synthesize i,allVideoUrls;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        allVideoUrls = [[NSMutableArray alloc]init];
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    [self playVideo:i];
}

-(void)playVideo:(int)_index{

    NSURL *fileURL = [NSURL URLWithString:[allVideoUrls objectAtIndex:i]];

    if(!moviePlayerController){
        moviePlayerController = [[MPMoviePlayerController alloc] init];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlaybackComplete:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayerController];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doneButtonClick:) name:MPMoviePlayerWillExitFullscreenNotification object:nil];
    }
    moviePlayerController.fullscreen = YES;
    [moviePlayerController setContentURL:fileURL];
    if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0){
        [moviePlayerController.view setFrame:CGRectMake(0, 62, 320, 504)];
    }
    else{
        [moviePlayerController.view setFrame:CGRectMake(0, 62, 320, 416)]; //y = 42
    }
    [self.view addSubview:moviePlayerController.view];

    [moviePlayerController play];   
}

- (IBAction)onTapBack:(id)sender {
    [moviePlayerController stop];
    [self dismissModalViewControllerAnimated:NO];
}

- (void)moviePlaybackComplete:(NSNotification *)notification{
    i++;

      [moviePlayerController stop];
      [moviePlayerController.view removeFromSuperview];
      [self dismissModalViewControllerAnimated:NO];
      [self dismissModalViewControllerAnimated:NO];
}

-(void)doneButtonClick:(NSNotification*)aNotification{
    NSLog(@"Done button Clicked");
    [self dismissModalViewControllerAnimated:NO];
}

【讨论】:

  • 谢谢你的回答@mAc,很抱歉给你带来困扰,但你能告诉我如何调用这个类吗?我写了一个方法来获取一个简单图像的点击并获取它的索引号,但我很困惑如何调用你给我的类,你能帮我吗?很抱歉给你添麻烦了,我对ios编程有点陌生
  • 另外一件事是我无法将 GAITrackedViewController 加入我的项目中,我必须使用一个额外的库来让它工作吗?谢谢
  • 使用 UIViewController 代替 GAITrackedViewController
  • 当您获得点击的图像的索引时,只需从 VideoPlayViewController 对象调用 playVideo 方法并将索引传递给它,如 [myObjectOfVideoPlayViewController playVideo:_indexTapped];
  • 谢谢你 mac 是否有一个特定的格式,当我提供一个 youtube 视频链接时,我必须使用这样的链接 http://www.youtube.com/v/xxxxx 调用该函数,当我调试并查看什么时候会发生什么说到重点[moviePlayerController play]; 这显示在 NSLog oid SendDelegateMessage(NSInvocation *): delegate (webView:identifierForInitialRequest:fromDataSource:) failed to return after waiting 10 seconds. main run loop mode: kCFRunLoopDefaultMode
【解决方案2】:

【讨论】:

    猜你喜欢
    • 2013-03-12
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多