如何在 Objective-C 中使用访问器方法进行指针工作
Posted
技术标签:
【中文标题】如何在 Objective-C 中使用访问器方法进行指针工作【英文标题】:How to do pointer work with accessor methods in Objective-C 【发布时间】:2012-12-07 15:24:30 【问题描述】:基本问题陈述:
我有一个很好的理由在需要通过引用传递小数的应用程序中做一些指针幻想。
所以我有一个存储许多小数的类,所以假设它具有这样的属性:
@property (nonatomic) double myDecimalValue;
我想通过引用其他类来传递它。
[someOtherObject sendMyDecimalByReference:&myDecimalValue];
但是,问题出现了!实际上必须写的方式(因为它是一个属性)是
[someOtherObject sendMyDecimalByReference:&decimalOrigin.myDecimalValue];
在objective-c中编译失败
我通过编写以下内容来解决它
- (double *) myDecimalValueRef;
[someOtherObject sendMyDecimalByReference:[decimalOrigin myDecimalValue]];
除了我有几十个这样的小数,我不想为每个值编写那个愚蠢的包装函数。
在 Objective-C 中是否有一种仅使用 Getter 函数的速记方法?
假设我有充分的理由不使用 NSNumber。
谢谢!
【问题讨论】:
您的(double *)
解决方案是最好的,但是看起来您正在尝试解决一个基本的设计缺陷。
我正在解决一个基本的设计缺陷... :)
重新设计吧;它会让你感觉更好;-)
不幸的是,这个项目的截止日期出人意料,我几乎没有其他可以快速想到的选择......所以我已经铺好了床......现在我必须躺在床上。下次我就知道了。
【参考方案1】:
您可以直接使用和访问实例变量而不是属性吗?然后它的工作方式与 C 结构成员相同...
@interface SomeClass : NSObject
@public
double myDecimalValue;
// Keep the getter or not, assuming you synthesize it in a way that uses the
// myDecimalValue ivar
@property (nonatomic) double myDecimalValue;
@end
那么你可以这样访问它:
[someOtherObject sendMyDecimalByReference:&decimalOrigin->myDecimalValue];
当然,健壮性是有限的,someOtherObject
在您实际取消引用该值时必须保持有效对象,并且如果您有子类/超类,则必须考虑这种设计...
【讨论】:
您不需要像这样访问它吗?【参考方案2】:虽然远非理想,但您可以将 ivars 公开。我什至讨厌这样说,但这是一个可能的解决方案。
另一种选择是为每个小数创建一对属性。创建常规属性和引用属性:
@interface Foo : NSObject
double _myDecimal;
@property (nonatomic, assign) double myDecimal;
@property (nonatomic, assign) double *myDecimalRef;
@end
@implementation Foo
@synthesize myDecimal = _myDecimal;
- (double *)myDecimalRef
return &_myDecimal;
- (void)setMyDecimalRef(double *)val
_myDecimal = *val;
@end
现在您可以执行以下操作:
[someOtherObject sendMyDecimalByReference:decimalOrigin.myDecimalRef];
或者是这样的:
*decimalOrigin.myDecimalRef = 3.14;
【讨论】:
更正:@property (nonatomic, assing) double *myDecimalRef;【参考方案3】:你看过 NSValue 类吗?它允许您将指针作为对象传递。
https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSValue_Class/Reference/Reference.html
【讨论】:
以上是关于如何在 Objective-C 中使用访问器方法进行指针工作的主要内容,如果未能解决你的问题,请参考以下文章
如何从另一个对象访问我的 Application Delegate 的窗口访问器方法?
#if 和 #ifdef Objective-C 预处理器宏有啥区别?
编译器错误:使用 Objective-C 选择器的方法与先前使用相同 Objective-C 选择器的声明冲突
如何从 Swift 扩展访问 Objective-C 类的私有成员?