Objective c 如何在特定地址初始化对象(NSObject子类)

Objective c 如何在特定地址初始化对象(NSObject子类),objective-c,ios4,sqlite,nsobject,Objective C,Ios4,Sqlite,Nsobject,嗨,我需要在指定的特定位置初始化NSObject(例如,通过void*指针)。为了了解一下上下文,我正在编写一个sqlite3聚合函数。为了保留这个函数的临时结果,我必须调用sqlite3_aggregate_上下文函数,它为我分配一块内存。我想在此位置存储一个NSDecimalNumber 到目前为止,我尝试了两种方法: 1) allocWithZone,通过执行以下操作: void *location = sqlite3_aggregate_context(...); //returns a

嗨,我需要在指定的特定位置初始化NSObject(例如,通过void*指针)。为了了解一下上下文,我正在编写一个sqlite3聚合函数。为了保留这个函数的临时结果,我必须调用sqlite3_aggregate_上下文函数,它为我分配一块内存。我想在此位置存储一个NSDecimalNumber

到目前为止,我尝试了两种方法:

1) allocWithZone,通过执行以下操作:

void *location = sqlite3_aggregate_context(...); //returns a block of allocated memory of a certain size

NSDecimalNumber *num = [[NSDecimalNumber allocWithZone:NSZoneFromPointer(location)] initWithInt:0];
这不起作用,因为nszonecompointer返回nil。文档中说,这个函数的参数必须是以前分配的指针,事实就是这样。我不知道这是否意味着使用NSZoneAlloc/Calloc进行分配

(二)

但在释放内存时,这会导致某种无限递归…不确定处理是什么。此处的屏幕截图:


如有任何建议,将不胜感激

您的第一个版本根本不起作用。NSZoneCompointer仅在传递从区域分配的指针时工作。它的使用是为了让您可以将同一区域中的对象分配给其他对象

第二个版本应该可以运行,不过如果没有更多的上下文,很难判断。您将向sqlite3\u聚合\u上下文传递什么作为要分配的内存大小?当你完成时,你是如何释放记忆的

第二个版本不起作用,因为“id”类型实际上是一个指针,所以您将它指向sqlite3_aggregate_context()返回的内存,然后将它指向alloc/init返回的内存。您确实需要存储一个指向指针的指针,以使其按您想要的方式工作

NSDecimalNumber是一个不可变的类,因此对其调用-init(而不是-initWithDecimal:)只会得到一些默认值。随着函数的进行,您使用哪种代码将NSNumber替换为新值


更重要的是,为什么要使用NSDecimalNumber,而不是C整数、double或其他什么?

您无法真正确定要在内存中创建对象的位置。NSZoneCompointer因sqlite3 API未使用区域分配其资源而失败

如果希望能够传递特定位置,则应该使用指向对象的指针(因此基本上是存储指向指针的指针)。然后可以从聚合函数中读取此信息,并相应地进行更新。只需确保不要在调用结束时简单地释放对象而不小心释放它(否则会发生泄漏)

例如,你可以做如下事情:

NSDecimalNumber** numberLocation = sqlite3_aggregate_context(...);
*numberLocation = [[NSDecimalNumber alloc] initWithDouble:25.0];
现在,您的特殊内存区域中存储了对对象的引用,并且可以随时访问它:

NSDecimalNumber* storedNumber = *numberLocation;
NSDecimalNumber* computedNumber = [[NSDecimalNumber alloc] initWithDouble:[storedNumber doubleValue] * someComputation];
[storedNumber autorelease];
*numberLocation = computedNumber;

另一方面,我同意马克的观点;也许这个不可变的类不是解决您问题的最佳方案?

我实际上发布了这个问题,没有得到太多信息:。我需要存储nsdecimalnumber,因为我使用的是货币,在写入数据库时,无法承受双类型的精度损失。我将它们存储为字符串,然后将它们作为nsdecimal数字读出,以便在聚合函数中进行求和。因此,到目前为止,需要存储一个临时变量和。我想用这种方法,我必须为每一行释放并创建一个新变量。。。。。。但我不知道如何才能做到这一点,否则。我将尝试这种方法,看看它是否有效。mark,sqlite3_aggregate_context的参数基本上是您想要分配的内存大小。有一个用于清理的回调,因此我可以可靠地清理nsdecimalnumber。我使用的是一个小数,因为我是在计算一分钱的分数,需要保持精度。
NSDecimalNumber* storedNumber = *numberLocation;
NSDecimalNumber* computedNumber = [[NSDecimalNumber alloc] initWithDouble:[storedNumber doubleValue] * someComputation];
[storedNumber autorelease];
*numberLocation = computedNumber;