gpt4 book ai didi

ios - 通过引用另一个类来传递 CGFloat 的最佳方法

转载 作者:行者123 更新时间:2023-12-01 19:32:01 25 4
gpt4 key购买 nike

ClassA , 我有一个 CGFloat值(value) x我想通过引用 ClassB这样,如果我对 CGFloat 进行更改在 ClassA ,它将反射(reflect)在对 x 的引用中在 ClassB .另外,当我将它传递给 ClassB ,我想将其存储为属性。

我曾考虑过使用 CGFloat 指针,但我正在努力找出正确的语法以使其成为属性:

@property(nonatomic) CGFloat *x;

然后取消引用它:
self->x

我考虑过使用 NSNumber但是无法使用 NSNumber 设置值这样它将在 ClassB 中更新.我想过放弃并制作一个包装类来存储 CGFloat ,但这似乎有点矫枉过正。

这样做的最佳模式是什么?

最佳答案

I thought about giving up and making a wrapper class to store the CGFloat, but this seems like overkill.



这种方法的优点是安全,您创建一个对象,两个类都引用它,而 ARC 负责内存管理。

该类很容易定义,例如:
@interface ABShare1 : NSObject
@property CGFloat x;
@end

@implementation ABShare1
@end

(在 .h.m 文件中——其他示例相同)

使用它的类将类似于:
@implementation ClassA
{
ABShare1 *one;
}
...
one = ABShare1.new; // somewhere in initialisation
...
... one.x = 42; ... z = one.x * 24; ...

注意:以上存储 ABShare1在私有(private)实例变量中引用,如果您愿意,可以将其存储在属性中,但没有必要。

您可以在传递对象的另一个类上调用方法,例如:
ClassB *myB;
...
[myB using:(ABShare1 *)sharedVariable];

并且其他类可以根据需要保留引用,内存管理是自动的。

I've thought about using a CGFloat pointer



这是“通过引用传递”的标准 C(Objective-C 的子集)方式。

您可以存储 CGFloat *在属性中,Objective-C 中的所有“对象”值属性都只存储指针(例如 @property NSString *name; 存储指向 NSString 对象的指针)。

您必须创建 CGFloat * 的变量。引用,相​​当于 newalloc/ init在 Objective-C 中。您可以使用变量的地址,例如就像是:
CGFloat actualX;
CGFloat *x = &actualX;

但您必须手动确保引用的变量 actualX , 至少和它的指针一样长,存储在 x , 正在使用中 - 不这样做会导致指针悬空。

另一个选项是动态分配存储,直接相当于 new ,例如就像是:
CGFloat *x = malloc(sizeof(CGFloat));

但是,您现在负责确定何时不再需要存储并释放它(使用 free() )。

对您的第一个解决方案是“矫枉过正”——也许是因为当您摆脱对内存管理的担忧时,您没有获得“变量”,而是获得/设置值的两个函数/方法。

第二种解决方案最接近“变量”的感觉,您只需使用 *sharedVariable而不是 sharedVariable .然而,虽然所需的手动内存管理是 C 程序员的标准,但它不适用于 Objective-C 程序员。

第三种方法混合了如何使用 C 中的结构 ( struct ) 的两种方法:共享一组变量而不是按地址单独共享每个变量,而是定义一个 struct每个变量都有一个成员,分配一个并共享其地址,例如:
typedef struct ABShare
{ CGFloat x;
CGFloat y;
} ABShare;

ABShare *one = malloc(sizeof(ABShare));
one->x = 42;
one->y = 24;

以上与第二种解决方案具有相同的内存管理问题,但我们可以将其转换为非常接近的 Objective-C 等价物:
@interface ABShare : NSObject
{
@public // required
CGFloat x;
CGFloat y;
}
@end

@implementation ABShare
@end

注意:使用 struct 可以有效地实现 Objective-C 类。 s,确实是第一个 Objective-C 编译器实际上将它们翻译成 C struct代码。

使用它非常接近 C:
ABShare *one = ABShare.new;
one->x = 42;
one->y = 24;

与 C 相同的“变量”外观,但具有自动内存管理。

最后一种方案本质上是 Objective-C 在创建 block 时管理共享变量的方式—— block 访问的所有局部变量都被移动到动态分配的对象/结构中,然后使用 -> 访问变量.

Objective-C 中哪个最好?第一个和第三个都是“Objective-C”风格,第二个通常在与 C API 交互时避免接受。在第一和第三选择中,无论您在语义上感觉“正确”,而不是担心性能,都可以。高温高压

关于ios - 通过引用另一个类来传递 CGFloat 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62208480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com