以下两种分配和初始化对象的方法有什么区别?
AController *tempAController = [[AController alloc] init];
self.aController = tempAController;
[tempAController release];
Run Code Online (Sandbox Code Playgroud)
和
self.aController= [[AController alloc] init];
Run Code Online (Sandbox Code Playgroud)
大多数苹果示例使用第一种方法.为什么要分配,初始化和对象然后立即释放?
这是一个初学者的问题,但我很长一段时间没有做过C++,所以这里......
我有一个包含动态分配数组的类,比方说
class A
{
int* myArray;
A()
{
myArray = 0;
}
A(int size)
{
myArray = new int[size];
}
~A()
{
// Note that as per MikeB's helpful style critique, no need to check against 0.
delete [] myArray;
}
}
Run Code Online (Sandbox Code Playgroud)
但现在我想创建一个动态分配的这些类的数组.这是我目前的代码:
A* arrayOfAs = new A[5];
for (int i = 0; i < 5; ++i)
{
arrayOfAs[i] = A(3);
}
Run Code Online (Sandbox Code Playgroud)
但这种情况非常糟糕.因为在循环迭代完成时,A(通过A(3)调用)创建的新对象会被破坏for,这意味着myArray该A实例的内部delete []变为-ed.
所以我认为我的语法必定是非常错误的?我想有一些看起来像矫枉过正的修复,我希望避免:
A …我已经玩了一段时间的iPhone开发,虽然当你是一个"硬核".NET开发人员时感觉有点尴尬,但是一旦你习惯它就不会那么糟糕.
在我读到的关于Objective-C的每本书中,都只讨论了内存管理的保留/释放(引用计数).作为一个古老的C/C++开发人员,使用malloc()和free()分配"正常"方式似乎很奇怪只在一些脚注中提到.
我知道malloc()和free()在Objective-C中工作,但我很好奇它是否是常见的做法.毕竟,如果我想分配一个包含100个整数的数组,那么这似乎是最有效的方法:
int *array = malloc(sizeof(int) * 100);
memset(array,0,sizeof(int) * 100);
// use the array
free(array);
Run Code Online (Sandbox Code Playgroud)
这确实是最好的方式,还是应该避免普通的C内存管理?
我有一个用Swift写的iOS应用程序泄漏内存 - 在某些情况下应该释放一些对象,但事实并非如此.我通过简单地添加如下deinit调试消息来了解这个问题:
deinit {
println("DEINIT: KeysProvider released")
}
Run Code Online (Sandbox Code Playgroud)
因此,在应该导致对象释放的此类事件之后,deinit消息应该存在于控制台中.但是,对于应该释放的某些对象,消息将丢失.仍然,Leaks Developer Tool没有显示任何泄漏.我该如何解决这种情况?
memory-leaks memory-management ios automatic-ref-counting swift
这涉及从9到11的Intellij.在IDEA窗口中我在右下角看到当前的内存使用情况,通常是"224M的254M"如何为Idea提供更多内存,因此它可能读作"224M of 512M"?
谢谢.
在GPS应用程序中,允许用户显示我们称为各种不同类型地图上的轨道的复杂位置点列表,每个轨道可以包含2k到10k的位置点.当在非Google地图类型上渲染轨道时,轨道会被大量剪裁,修剪和路径简化.这是为了降低内存使用率并提高性能.我们通常最终只会向OpenGL管道提交远远少于一千(聚合)转换的位置点,即使在最坏的情况下也是如此.
在整合Google Maps SDK for iOS时,我们最初尝试继续利用我们自己的OpenGL轨道渲染系统,但遇到了与OpenGL上下文冲突相关的问题(渲染工作正常,但我们无法获得GMSMapView和我们自己的内部OpenGL资源在没有人触摸已删除的内存的情况下释放.
因此,我们正在尝试利用GMSPolyline构造并让Google SDK执行轨道渲染,但我们遇到了主要的内存使用问题,并正在寻找解决它们的指导.
使用Xcode Instruments,我们在创建大约25条多线路时监控内存使用情况,总线位置总数约为23k(不是每个).在创建多线路的过程中,应用内存使用量从大约14 MB增加到大约172 MB,净峰值大约为158 MB.在创建所有多边形线之后不久,内存使用率最终下降到大约19 MB并且看起来稳定,累积净值大约为5 MB,所以看起来每个位置点需要大约220个字节(5 MB/23k点)到商店.
令我们伤心的是峰值内存使用率.虽然我们的实验室测试只用23K的位置点,在现实世界中往往有更多的人,和iOS似乎要抛弃我们的应用程序后,谷歌地图有大约450 MB消耗上的iPhone 5(而我们内部的多线大约渲染系统峰12 MB用于相同的测试用例).
显然,该GMSPolyLine结构不适用于我们需要的重量级使用.
我们尝试使用单独的自动释放池包装一些多边形线创建循环,然后在适当的位置排出这些循环,但这对内存使用没有影响.在创建多边形线并且控制返回到主运行循环之后的峰值内存使用根本没有改变.后来很明显为什么; 在创建多边形线之后,第一个DisplayLink回调之前,Google Map系统不会释放资源.
我们接下来的努力将是手动限制我们在GMSPolyline上推送的数据量,可能使用我们自己的边界测试,裁剪,修剪和最小化,而不是依靠Google Maps来有效地执行此操作.
这里的缺点是,当用户在地图上平移/缩放时,可能会分配和释放更多GMSPolyline对象.这些对象中的每一个都将具有更少的位置点,但是,我们仍然担心这种方法的无法预料的后果,许多GMSPolyline分配和解除分配的隐藏开销.
所以问题是,处理这种情况的最佳方法是什么,谷歌的某些人是否可以对任何GMSPolyline最佳实践,上限,瓶颈等有所了解?
如何在.NET中以编程方式测量当前进程的总内存消耗?
我想弄清楚为什么我的应用程序使用了这么多内存.我经常看到它使用15到18MB之间,这远远高于我的预期.我通过DDMS查看了堆大小,看到了这个:

这看起来有点可疑,因为我的应用程序根本不处理大图像.事实上,我的应用程序中drawables的总和大约是250KB.所以我创建了一个堆转储并使用MAT来找到所有这些内存的去向.byte []数组是迄今为止最大的消费者,所以我深入研究并注意到以下内容:

我完全不知道为什么sPreloadedDrawables负责这么高的保留堆大小.我也不知道如何确定根本原因,或者如何"修复"它.
我应该从哪里出发?我的应用程序主要通过不处理图像数据的服务在后台运行.我确实有用户可以选择使用的活动,但同样,他们使用的小型drawable不能解释如此大的堆大小.我还检查了任何令人讨厌的活动泄漏事件等,但没有找到任何.
编辑:我注意到在模拟器中运行时堆大小要大得多.这很令人困惑.:/
使用C#对象初始化器有什么好处吗?
在C++中没有引用,并且所有内容都封装在对象中,因此在创建对象后使用它们而不是初始化成员是有意义的.
它们在C#中使用的情况如何?
.net ×2
c# ×2
objective-c ×2
android ×1
c ×1
c++ ×1
cocoa ×1
cocoa-touch ×1
ddms ×1
destructor ×1
gps ×1
ios ×1
memory ×1
memory-leaks ×1
optimization ×1
performance ×1
php ×1
pointers ×1
swift ×1