所以我们有一个swift库,我们在基于Objective-C的项目中使用它。
在swift中,有一个这样的类:
/// Base class for all axes
@objc(ChartAxisBase)
open class AxisBase: ComponentBase
{
public override init()
{
super.init()
}
/// Custom formatter that is used instead of the auto-formatter if set
weak fileprivate var _axisValueFormatter: IAxisValueFormatter?
/// Sets the formatter to be used for formatting the axis labels.
/// If no formatter is set, the chart will automatically determine a reasonable formatting (concerning decimals) for all the values that are drawn inside the chart.
/// Use `nil` to use the formatter calculated by the chart.
open var valueFormatter: IAxisValueFormatter?
{
get
{
if _axisValueFormatter == nil ||
(_axisValueFormatter is DefaultAxisValueFormatter &&
(_axisValueFormatter as! DefaultAxisValueFormatter).hasAutoDecimals &&
(_axisValueFormatter as! DefaultAxisValueFormatter).decimals != decimals)
{
let df = DefaultAxisValueFormatter(decimals: decimals)
_axisValueFormatter = df
NSLog("found nil vf, assigning to \(_axisValueFormatter)")
}
NSLog("returning \(_axisValueFormatter)")
return _axisValueFormatter
}
set
{
_axisValueFormatter = newValue //?? DefaultAxisValueFormatter(decimals: decimals)
}
}
...
}
如您所见,有一个私有变量声明为弱:
weak fileprivate var _axisValueFormatter:IAxisValueFormatter?
并且valueFormatter
有一个getter和setter。
但是,最新的Xcode 8.2.1将为valueFormatter
生成一个Objective-C标头,如:
@property(非原子,强)id _Nullable valueFormatter;
正如您所看到的,它很强大,我也可以在头文件中找到任何_axisValueFormatter
。
这是预期的吗?我怎么能做对的?提前谢谢。
答案 0 :(得分:0)
您已将valueFormatter
定义为强属性。 _axisValueFormatter
定义为fileprivate
,因此无法从外部访问。所以一切都如预期的那样。
总结:
_axisValueFormatter
将保持弱势。 valueFormatter
的存储修饰符无关紧要,因为内部实施依赖弱私有财产_axisValueFormatter
。您声称valueFormatter
很强,但之后您使用weak
属性支持它,该属性可以随时变为零。这是一种副作用的财产。我建议避免这种情况,只需将valueFormatter
标记为weak
即可调整对使用您的课程的开发人员的期望。
查看关于弱引用和强引用的文档: