我有这个非常简单的程序,我只是创建一个对象并查看保留计数.
#import <Foundation/Foundation.h>
#import "GeometryCalculator.h"
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
GeometryCalculator *calculator = [[GeometryCalculator alloc] init];
NSLog(@"Counter: %d", [calculator retainCount]);
[calculator release];
[pool drain];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望我的retainCount为1,但它是16863520.Class GeometryCalculator完全是空的.没有方法,没有实例变量.
我被告知不要担心保留计数.我明白我不应该决定release或retain使用基于条件逻辑retainCount,但我不应该担心吗?我认为这些以某种方式对应于内存使用.
例如,如果我有一堆子视图UIView,我也已经放入了NSArray能够迭代它们,那么这不会使保留计数加倍,从而使应用程序的内存使用量增加一倍吗?如果是这样,如果子视图是500个UIControl实例,这是否代价高昂或微不足道?当然,这假设我需要500个实例.
以某种方式使用boost :: object_pool <> :: construct和非const引用是否可行?
以下代码段无法编译(VS2010):
foo::foo(bar & b)
{
}
static boost::shared_ptr<foo> foo::create(bar & b)
{
return boost::shared_ptr<foo>(foo_pool.construct(b),
boost::bind(& boost::object_pool<foo>::destroy, & foo_pool, _1));
}
Run Code Online (Sandbox Code Playgroud)
VS2010抱怨无法将bar转换为const bar&.看看boost :: object_pool <> :: construct,原因很清楚:
element_type * construct(const T0 & a0)
Run Code Online (Sandbox Code Playgroud)
我不能使ctor参数const.是否有一个技巧使boost :: object_pool <>与我的foo类一起工作?
以下程序不断崩溃,我无法弄清楚是什么问题.似乎v在某个主要功能中不可用..
#include <iostream>
#include <vector>
using namespace std;
vector<string> *asdf()
{
vector<string> *v = new vector<string>();
v->push_back("blah");
v->push_back("asdf");
return v;
}
int main()
{
vector<string> *v = NULL;
v = asdf();
for (int i=0; i<(v->size()); v++) {
cout << (*v)[i] << endl;
}
delete v;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我们的服务器最近一直在下降很多,我的任务是改善一组被认定为罪魁祸首的类的内存使用.
我有初始化对象实例的代码,如下所示:
布尔var1; 布尔var2; ...布尔var100;
void setup() {
var1 = map.hasFlag("var1");
var2 = map.hasFlag("var2);
.
.
.
if (map.hasFlag("some flag") {
doSomething();
}
if (var1) {
increment something
}
if (var2) {
increment something
}
}
Run Code Online (Sandbox Code Playgroud)
设置代码大约需要1300行.我的问题是,在使用太多实例变量方面,这种方法是否有可能更有效.
顺便说一下,实例变量用在"main"方法handleRow()中,例如:
handleRow(){
if (var1) {
doSomething();
}
.
.
.
if (var100) {
doSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
我想的一个解决方案是通过删除setup方法中的实例变量来更改实现,并在需要时直接从地图中调用它:
handleRow(){
if (map.hasFlag("var1") {
doSomething();
}
.
.
.
if (map.hasFlag("var100") {
doSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我正在考虑的一个解决方案,但我想听听社区的意见.:)
我已经写了几个星期的目标c了.然而,这个问题仍困扰着我.任何人都可以用痛苦的英语解释:何时保留一个物体?
谢谢
我有一个单独的对象PoolManager,它在plist中加载并保存一些数据.在我的程序中,当需要了解我的池时,它会询问[PoolManager sharedPoolManager]它的属性.我有一个视图负责设置这些属性,而其他所有其他属性只是从中读取.一切正常,然后无缘无故地说,它开始崩溃了.我设置NSZombieEnabled = YES并且可以看到,当我访问这两个NSString属性中的一个时,它们似乎已被释放.调试器消息是:*** -[CFString respondsToSelector:]: message sent to deallocated instance 0x5a336d0
我尝试回到之前的快照,其中一切正常,它仍然这样做.我甚至使用TimeMachine从昨天开始回到项目中,它也是如此.我很困惑.
这是单例对象代码......它是surface和shape字符串显然是僵尸.对不起NSLogs
// MyPoolSingleton.h
#import <Foundation/Foundation.h>
#define kFileName @"data.plist"
@interface PoolManager : NSObject {
float volume;
float length;
float width;
float depth;
NSString *surface;
NSString *shape;
BOOL isMetric;
int fcTarget;
int cyaTarget;
int taTarget;
int chTarget;
int saltTarget;
}
@property float volume;
@property float length;
@property float width;
@property float depth;
@property (nonatomic, retain) …Run Code Online (Sandbox Code Playgroud) 在Objective-C中编写是否安全
self.propery = [[SomeClass alloc] init];
Run Code Online (Sandbox Code Playgroud)
代替
SomeClass *tmp = [[SomeClass alloc] init];
self.property = tmp;
[tmp release];
Run Code Online (Sandbox Code Playgroud)
或者第一种形式会泄漏内存吗?
std::string str = "string":
const char* cstr = str.c_str();
str.clear();
//here, check if cstr points to a string literal.
Run Code Online (Sandbox Code Playgroud)
cstr在调试或发布模式下运行程序时,如何检查是否仍指向字符串?
有没有办法在C++中使用异常处理来确定这个?
我知道这听起来很奇怪,但我需要我的应用程序快速运行,它会做很多新的和删除.所有函数调用new并将ptr传递给期望推送指针到列表或双端队列的那些.
在主循环结束时,程序遍历所有内存并删除它(除非我忘记删除它).我并不夸张.是否有一种模式允许我的代码为new分配objs但不删除它们但只是将其标记为未使用,以便该结构的下一个新代码将使用它而不是完全分配?
我想这会提高性能.它没有完全做到所以我不能基准但我相信我会看到一个提升,如果这是自动的那么好.我可以使用这样的模式或标志吗?
我正在使用gcc(linux,win)和MSVC2010(win).