我正在实施一个smartpointer模板,有一件事让我感到困惑; 将smartpointer作为参数传递给另一个函数时,如何增加引用计数器?我重载什么操作符来增加引用计数?
例如:
class test
{
test() { }
~test() { }
};
void A()
{
SmartPointer<test> p;
B(p);
}
void B(SmartPointer<test> p)
{
C(p);
}
void C(SmartPointer<test> p)
{
// p ref count is still 1 and will be destroyed at end of C
}
Run Code Online (Sandbox Code Playgroud)
谢谢
据我所知,如果一个对象的保留计数变为0,则会调用dealloc.但是我将保留计数设置为-1.这是什么意思?
我使用以下代码 -
Demo *obj1 = [[Demo alloc] init];
NSString *s = [[NSString alloc] initWithString:@"mithilesh"];
NSString *s1 = [NSString stringWithString:s];
[s release];
object_setInstanceVariable(obj1, [propertyName cString], s1);
//printing retain count
NSLog(@"retain count of name = %i",[obj1.name retainCount]);
Run Code Online (Sandbox Code Playgroud)
输出:
retain count of name = -1
Run Code Online (Sandbox Code Playgroud)
方法stringWithString返回的字符串:何时获取释放?
我正在创建一个将由演示程序使用的服务.我是一个将类型定义为类或结构的分支..Net为每个dll和exe创建1个堆栈(用于存储值类型)或每个程序创建1个堆栈.我非常确定它为每个程序创建一个托管堆但不确定堆栈.请帮我.
谢谢,Omkar
我编写的应用程序通过外部服务将数据推送到某个服务器.我必须使用一个定义的结构,它看起来像这样:
class A {
B *b; // Another class built the same principle
C *c; // And another one
...
};
Run Code Online (Sandbox Code Playgroud)
它在某处归结为
class XY {
double *some_val;
std::string *another_val;
...
};
Run Code Online (Sandbox Code Playgroud)
我面临的问题是,如果你愿意,我只处理指针指针,我还没有想出处理这些结构的最佳方法.
我自己可以用new和处理内存管理delete,但是之后我不得不做大量的清理工作,而且我忘记清理一些东西,而我的程序漏洞在我看来太高了.
我可以在本地声明这些类并以这种方式填充它们,但是我必须事先声明每个变量,所以我必须在我可以做任何事情之前分析类层次结构,之后它仍然会变得非常混乱.
智能指针也出现在我脑海中,但由于它们基本上是一个包装指针的类,我必须事先声明它们,相比之前方法的优势似乎很小.
有没有人知道一个聪明的,最重要的是,可读/可维护的方法来处理这些庞大的指针结构?
更新:
如果有人遇到同样的问题,这是我现在的方法(虽然我仍然觉得它很乱!):
#include <boost/shared_ptr.hpp>
#include <boost/any.hpp>
class A {
B *b_;
double *d_;
};
int main() {
std::vector<boost::any> vp;
// Create instance of A
vp.push_back(boost::shared_ptr<A>(new A));
A *a = boost::any_cast<boost::shared_ptr<A> >(vp.back()).get();
// Create instance of B in A
vp.push_back(boost::shared_ptr<B>(new B)); …Run Code Online (Sandbox Code Playgroud) 我正在读一个C代码
char * buf = malloc(sizeof (char *) * 16)
代替
char buf[sizeof (char *) * 16]
有什么不同?好吧,我觉得第一个表达不必要,如果realloc()不叫,或者我错了思考?
我在NSString课堂上宣布一个类型的ivar .要初始化此ivar的值,我使用以下代码:
NSString *myVar;
-(void)inAnyMethod
{
myVar = [NSString stringWithFormat:@"%@",theValue];
}
Run Code Online (Sandbox Code Playgroud)
我必须释放这个伊娃吗?根据我的理解,这不是我的责任.但在大多数情况下,我以这种方式使用的字符串会导致泄漏.
我错过了什么?
背景 -
我在项目上使用自动引用计数.根视图是表格视图(主/细节设置),显示"幻灯片放映"列表.单击一个表格单元格,您将进入详细视图,其中包含一个带有视图的滚动视图(viewController.view)(这是"幻灯片放映").每个幻灯片都有一个前盖和后盖(相同的视图控制器格式不同),夹着可变数量的页面.以下是加载幻灯片放映的代码:
- (void)loadScrollView
{
// The front and back cover are set in Interface Builder because they
// are reused for every slide show, just labels are changed.
[self.scrollView addSubview:self.frontCoverViewController.view];
[self.frontCoverViewController setCoverTitle:_data.name creationDate:_data.creationDate isFrontCover:YES];
[self.pagesArray addObject:self.frontCoverViewController];
for (int i = 0; i < [self getTotalNumberOfComps]; i++)
{
PageViewController *pageView = [[PageViewController alloc] init];
pageView.data = [_compsArray objectAtIndex:i];
[_scrollView addSubview:pageView.view];
pageView.data.imgView = pageView.imageView;
pageView.slideShowViewController = self;
[_pagesArray addObject:pageView];
}
[self.scrollView addSubview:self.backCoverViewController.view];
[self.backCoverViewController setCoverTitle:_data.name creationDate:_data.creationDate isFrontCover:NO];
[self.pagesArray addObject:self.backCoverViewController];
[self.scrollView bringSubviewToFront:_frontCoverViewController.view]; …Run Code Online (Sandbox Code Playgroud) 现在我有一个ARC项目,它使用超过6米的内存推送聊天ViweController(UItableview与自定义单元格).我不知道为什么会这样.最有趣的是我无法确定它需要太多内存的原因.这是我的仪器截图:

在更详细的视图中,它看起来像:

我认为libRip.A.dylib需要太多内存.你有什么想法吗?
请解释一下,什么是奇怪的libRip.A.dylib库?
在内存和计算时间方面,最好将int转换为:
int thisLetterInt = (int)[(NSNumber *)[levelSavedSolutionArrayFIX objectAtIndex:i] intValue];
Run Code Online (Sandbox Code Playgroud)
要么
int thisLetterInt = [[levelSavedSolutionArrayFIX objectAtIndex:i] intValue];
Run Code Online (Sandbox Code Playgroud)
还是完全相同?
另外,在任何一种情况下,我都不负责释放吗?
我正在使用RestKit开发RESTful应用程序.我有一个实际处理请求的包装器对象,甚至可以作为delegatefor RKObjectManager.我遇到了一个与ARC如何处理实例变量并保留它们有关的问题,我很清楚我不明白ARC是如何工作的.
所以当我这样做时,它会失败(与发送到解除分配的实例的消息有关的错误)
MyTestClient *testClient = [[MyTestClient alloc] init];
但是当我宣布一个房产并做到这一点时,一切都很好:
self.testClient = [[MyTestClient alloc] init];
根据我的理解,在ARC下,实例变量始终strong是默认的,但它的生命周期是声明它的方法的范围.
既然我不能做[testClient retain],我唯一的选择是把它作为财产吗?
memory-management objective-c ios restkit automatic-ref-counting
objective-c ×4
ios ×3
iphone ×3
c++ ×2
memory-leaks ×2
.net ×1
arrays ×1
c ×1
c# ×1
casting ×1
instruments ×1
ios4 ×1
java ×1
nsstring ×1
optimization ×1
pointers ×1
restkit ×1
retain ×1
retaincount ×1