通过引用其他类传递CGFloat的最佳方法

问题描述 投票:1回答:1

ClassA中,我有一个CGFloatx,我想通过参考ClassB来传递,这样,如果我对CGFloat中的ClassA进行了更改,它将反映在x中对ClassB的引用。另外,当我将其传递给ClassB时,我想将其存储为属性。

我已经考虑过使用CGFloat指针,但是我正在努力找出使它成为属性的正确语法:

@property(nonatomic) CGFloat *x;

然后取消引用它:

self->x

我曾考虑过使用NSNumber,但是无法使用NSNumber设置值,以使其在ClassB中更新。我曾想过放弃并制作一个包装器类来存储CGFloat,但这似乎有点过分。

执行此操作的最佳模式是什么?

ios objective-c cocoa-touch
1个回答
0
投票

ClassA

@interface ClassA: NSObject

@property (nonatomic) CGFloat value;

-(CGFloat *)addressOfValue;

@end

@implementation ClassA

-(CGFloat *)addressOfValue {
    return &_value;
}

@end

ClassB

@interface ClassB: NSObject

@property (nonatomic) CGFloat *value;

@end

@implementation ClassB
@end

用法:

ClassB *b = [ClassB new];
ClassA *a = [ClassA new];

b.value = a.addressOfValue;

a.value = 10;
NSLog(@"a: %f b: %f", a.value, *b.value);

*b.value = 20;
NSLog(@"a: %f, b: %f", a.value, *b.value);

评论:

  • 为什么addressOfValue@property只是说有一个setter和getter。但这并没有说明该值实际存储在哪里。这里需要的是实例变量地址。
  • 如果您不知道自己在做什么,这将非常危险。您可以轻松破坏堆并使应用程序崩溃(例如,当ClassA被释放时,您仍将使用ivar指针)。只要a有效,只要b(或更长时间),它将起作用。
  • 直接从另一个类操纵实例变量不是一个好主意。您可以将整个ClassA传递给ClassB(注意保留周期),创建一个包装器类(这两个类的通用模型),使用委派,块……这实际上取决于ClassAClassB实际上是(视图控制器,模型等)。
© www.soinside.com 2019 - 2024. All rights reserved.