【发布时间】:2026-01-03 16:10:02
【问题描述】:
我会长话短说,并举一个我的问题的例子。
给定一个具有指向原始类型的指针作为属性的类:
@interface ClassOne : NSObject
{
int* aNumber
}
@property int* aNumber;
类被实例化,aNumber被分配并赋值,相应地:
ClassOne* bob = [[ClassOne alloc] init];
bob.aNumber = malloc(sizeof(int));
*bob.aNumber = 5;
然后通过引用传递给此类类的单独实例的 aNumber 值,相应地:
ClassOne* fred = [[ClassOne alloc] init];
fred.aNumber = bob.aNumber;
Fred 的 aNumber 指针随后被释放、重新分配并分配一个新值,例如 7。
现在,我遇到的问题; 由于 Fred 被分配了与 Bob 相同的指针,我希望 Bob 的 aNumber 现在的值为 7。它没有,因为由于某种原因它的指针被释放,但没有重新分配(它仍然指向第一次分配的地址相同,现在已释放)。 然而,Fred 的指针在不同的内存位置分配了值 7。
为什么会这样?我在误解什么?我怎样才能让它像 C++ 一样工作?
编辑: 对,一个新鲜的早晨,我可以看到我举了一个非常糟糕的下午 5 点综合症的例子。 我想做的更像是这样的:
@interface classOne : NSObject
{
int* numA;
}
@property int* numA;
@implementation...etc
numA 被分配并赋值。稍后,在一个单独的线程中(带有必要的锁等),这是完成的:
int* numB= malloc(sizeof(int));
*numB = 5;
free(RefToClassOne.numA);
RefToClassOne.numA = numB;
numA 确实被释放了,但没有被分配 numB 指向的值,这是我想要的行为。
更长的故事的一部分是它是传递给openGL的顶点缓冲区的一部分的顶点计数。我意识到它不应该是一个指针,但是坐标的 float* 缓冲区以相同的方式处理并且需要具有可变大小,所以我也想解决这个问题。
【问题讨论】:
-
呃,这是在要求一个充满伤害的世界......并且适当的封装将在您的
-[ClassOne init]方法中调用malloc()。 -
@DaveDeLong 我很好奇你为什么这么说?我正在为同样的问题而苦苦挣扎,但我什至没有达到 Tobster 的程度。请看这里*.com/questions/12454585/…
标签: objective-c integer pointers storage primitive