在ClassA
中,我有一个CGFloat
值x
,我想通过参考ClassB
来传递,这样,如果我对CGFloat
中的ClassA
进行了更改,它将反映在x
中对ClassB
的引用。另外,当我将其传递给ClassB
时,我想将其存储为属性。
我已经考虑过使用CGFloat指针,但是我正在努力找出使它成为属性的正确语法:
@property(nonatomic) CGFloat *x;
然后取消引用它:
self->x
我曾考虑过使用NSNumber
,但是无法使用NSNumber
设置值,以使其在ClassB
中更新。我曾想过放弃并制作一个包装器类来存储CGFloat
,但这似乎有点过分。
执行此操作的最佳模式是什么?
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
(注意保留周期),创建一个包装器类(这两个类的通用模型),使用委派,块……这实际上取决于ClassA
和ClassB
实际上是(视图控制器,模型等)。