我真的很难在 Objective-C 中使用自定义构建的类。我可以使它们很好,但是一旦我使用它们来执行诸如播放视频之类的操作(使用 MPMoviePlayerController 类),我就会遇到内存分配问题。我在 memory management 上阅读并重新阅读了 Apple 自己的文档, 我经历过各种online tutorials ,我在这里询问并阅读了许多问题。但是我一次又一次地遇到相同的内存分配问题。
到目前为止,我一直通过将我的所有代码移动到 AppDelegate 类中来解决我的内存问题(我觉得这不是正确的做法,我不想重载我的 AppDelegate 类)。我在 AppDelegate 类中的所有属性的行为都符合我的预期。
但是,一旦我构建了一个自己的类来处理特定任务,一些属性就会意外释放(我的所有属性都被声明为强属性,但它们在使用时仍会被释放)。例如,在播放视频时,持有播放视频的对象的属性会被释放。我不明白这是如何或为什么发生的。
我觉得我在做一些根本错误的事情。
一段时间以来,我一直试图弄清楚这一点,(请参阅我过去的问题),但无论我做什么,我都会遇到 EXC_BAD_ACCESS 问题,通常是因为我声明为强大的属性在我的控制之外被释放,当我不想它。
我为问这样一个开放式问题感到难过,但我觉得我已经用尽了其他可用的选项。
有人可以从头开始向我展示使用 MPMoviePlayerController 从网络服务器播放视频的类的正确方法 - 但最重要的是,向我展示如何在绝对没有内存问题的情况下做到这一点,在任何时候。没有什么会意外释放,当我需要它时(即视频仍在播放时),所有东西都在内存中。
我很抱歉提出这个问题,但是在为这个问题挣扎了几个月之后,我不知道我还能做什么。
提前致谢。
最佳答案
要正确使用 MPMoviePlayerController,您需要决定何时播放视频、如何处理显示和隐藏电影播放器以及何时显示内容。我将在最后用一个示例项目解释一种方法(向下滚动以获取下载链接)。您可以根据自己的喜好随意使用和修改项目。
最重要的部分 是将 MPMoviePlayerController 声明为自定义 View Controller 的属性——或自定义 View Controller 中使用的自定义类——而不是显式(或隐式,通过关闭 View Controller 等)释放自定义类、自定义 View Controller 或 MPMoviePlayerController,直到完成它们。
将所有代码放在应用程序委托(delegate)中通常不是好的设计。您希望将代码展开,使其模块化且易于阅读。
从一个带有 .xib 的基本 XCode 项目开始。然后通过转到 File > New > File ,从左侧选择 Cocoa Touch 并选择 Objective-C 类来创建自定义 View Controller (.h 用于接口(interface),.m 用于实现,.xib 文件用于用户界面)。单击下一步,并将文件命名为 MyMovieViewController 。选中“使用 XIB 用于用户界面”框。
现在,修改您的 App Delegate:
在 AppDelegate.h 中,为您的自定义 View Controller 添加一个属性:
@property (nonatomic, strong) MyMovieViewController
*myMovieViewController;
MyMovieViewController 的 UINavigationController 作为其“根 View Controller ”:self.myMovieViewController = [MyMovieViewController alloc] initWithNibName:@"MyMovieViewController" bundle:nil];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:myMovieViewController];
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];
MyMovieViewController 。MyMovieViewController.h 中,给它一个名为 MPMoviePlayerController 的 mpController 作为属性:@property (nonatomic, strong) MPMoviePlayerController *mpController;
MyMovieViewController.m 的 viewDidLoad 函数中,实例化 mpController :NSString *urlString =@"..."; //your url here
NSURL *url = [NSURL URLWithString:urlString];
self.mpController = [[MPMoviePlayerController alloc] initWithContentURL:url];
MyMovieViewController 的 xib 中创建两个按钮,并将它们链接到 -(IBAction)showControllerButtonPressed:(id)sender 和 -(IBAction)hideControllerButtonPressed:(id)sender,都在 .m 文件中实现self.mpController.view.frame = CGRectMake(0,0,320,320); //your size here
[self.view addSubview:self.mpController.view];
[self.mpController prepareToPlay];
[self.mpController play];
[self.mpController pause];
[self.mpController.view removeFromSuperview];
mpController 作为 MyMovieViewController 的根 View Controller ,因此属性 MyMovieViewController 将在程序的整个生命周期中存在于 UINavigationController 中。如果您想呈现和关闭 MyMovieViewController ,每次重新加载电影,您应该在关闭时设置 mpController = nil 。mpController 在 View 出现、消失、背景化等时暂停和播放。MPMoviePlayerController 作为自定义 View Controller 的属性。 (请注意,该项目还有一个 View Controller ,用于显示和关闭包含 MPMoviePlayerController 的 View Controller 。为确保内存被正确释放,请使用 Instruments 和 Allocations 工具运行项目。按 ViewController 、 MyMovieViewController 和MPMoviePlayerController 以查看相关类被分配和解除分配):关于ios - 如何制作一个使用 MPMoviePlayerController 从网络服务器播放视频的类,没有任何内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19903889/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru