这基本上与我的另一个问题有关 here
我正在尝试释放 NSMutableArray其中包含 View Controller 。我做:
self.viewControllers = nil;
viewWillDisappear因为我正在转向另一个 View 。但无论我做什么, View Controller 都不会被释放。我也试过:[[scrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
NSMutableArray 的 View .NSMutableArray 的引用计数,但我看到实时 View Controller (在仪器中)的计数没有改变是 0。
最佳答案
几个观察:
removeFromSuperview是不必要的,不会影响retainCount View Controller 本身。不过,我是否从这次尝试中推断出您已经创建了 View Controller ,然后将它们的 View 添加到 ScrollView 中?如果是这样,您是否做了必要的工作 addChildViewController对于每一个?如果是这样,您确实需要执行相关的 removeFromParentViewController不过,对于其中的每一个。 viewControllers数组,以及如何填充它。@property (nonatomic, retain) NSMutableArray *array;
autorelease 本身的 NSMutableArray(因为我使用的访问器方法会为我保留它),以及 release 对象的显式 Object) :- (void)makeArray
{
// create an array, using the accessor method (thus why I'm using an autorelease object)
self.array = [[[NSMutableArray alloc] init] autorelease];
// just add four random objects to the array.
// note, adding them to the array increases their retain count, thus I
// release them to bring the retain count back to +1 ... I could have
// done that via autorelease, too
for (NSInteger i = 1; i < 4; i++)
{
Object *obj = [[Object alloc] initWithString:[NSString stringWithFormat:@"Test %d", i]];
[self.array addObject:obj];
[obj release];
}
}
retainCount值,我可以看到一切都有 retainCount +1,视情况而定:- (void)logArray
{
// let's examine the retain counts for the objects in the array
// should be "1" given there are no other strong references anywhere
for (id obj in self.array)
NSLog(@"%s %@ (retainCount = %d)", __FUNCTION__, obj, [obj retainCount]);
// let's also examine the retain count for the array, itself
// this should also be "1"
NSLog(@"%s retainCount = %d", __FUNCTION__, [self.array retainCount]);
}
Object 类在其 NSLog 方法中执行了 dealloc):- (void)clearArray
{
// let's use the accessor method to release the array and make sure
// the pointer is nil
self.array = nil;
}
self.viewControllers = nil; 语法是一种非常适合释放数组(及其成员对象)的方法,假设数组定义为 retain属性如上一点所示。但是,如果数组的成员对象没有被释放,那么这些对象显然没有得到它们的 retainCount降到零。我会尝试,就在您的 self.viewControllers = nil; 之前,记录不仅retainCount数组本身,还有 retainCount阵列的单个对象,以确认它们的 retainCount设置。retainCount在那一点上+1(否则还有其他东西保留它们,要么因为它们被过度保留,你在这些 View Controller 中有一些保留周期(又名强引用周期),或者其他东西合法地保留它们(例如在某些时候,您将这些 View Controller 之一推送到导航器堆栈上,但您还没有将它们弹出))。 NSTimer由 View Controller 和失败 invalidate和 release需要释放 View Controller 的计时器。与您离线聊天,这听起来可能是您尝试 release 的问题所在。 NSTimer在 dealloc ,但 dealloc永远不会调用,因为计时器本身保留了 View Controller 。您需要手动invalidate和 release NSTimer (通过释放对 View Controller 的强引用)在您释放 NSMutableArray 之前具有计时器的任何 View Controller 。 . (例如,可能有一个停止计时器的协议(protocol),让您的 subview Controller 符合该协议(protocol)。)
关于ios - View Controller 的 NSMutableArray 不释放其对象的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13328949/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序