【问题标题】:Setter/Getter for custom object not working自定义对象的 Setter/Getter 不起作用
【发布时间】:2012-07-16 22:47:17
【问题描述】:

我有以下自定义对象:


@interface LoadDescription : NSObject
@property (nonatomic) float start, stop, startMagnitude, stopMagnitude;
@end

我的一个控制器中有一个对象作为属性:


@property (nonatomic, strong) LoadDescription *editingLoad;

但是当我尝试在editingLoad属性中设置/获取属性时......


float tableValue = [textField.text floatValue]; 
NSLog(@"value in table is %f", tableValue);
self.editingLoad.startMagnitude = tableValue;
NSLog(@"Load magnitude is %i", (int)self.editingLoad.startMagnitude);

...并运行 iOS,控制台输出显示虽然 tableValue 是我输入的任何值,但 self.editingLoad.startMagnitude 始终为 0.00000000,这让我认为 setter/getter 有问题。

如果相关,我正在运行 ARC。

任何帮助表示赞赏,在此先感谢!

【问题讨论】:

  • 你检查 self.editingLoad 不是 nil 吗?

标签: iphone objective-c ios ipad properties


【解决方案1】:

editingLoad 对象是否在属性分配之前分配和初始化?

如果不是这可能是您的问题,否则如果您将类型强制转换为 float 小于 1,我相信它将始终为零。我不知道您对“tableValue”的期望值是什么

当第二个日志打印出 float/double "%f" 时会发生什么?

【讨论】:

  • 是的,你已经死定了 alloc/init。哎呀。非常感谢!
  • 应该是控制器的init方法中的_editingLoad = [[LoadDescription alloc] init]吧?使用 self.editingLoad 仅在包含变量赋值的方法中声明时才有效——有效地分配/初始化editingLoad多次,这看起来很奇怪。
  • 不,我错过了阅读...如果您在 ViewController 中初始化事物,那么执行此操作的最佳位置是 viewDidLoad 方法。原因是因为 ViewController 没有调用标准的 init。
【解决方案2】:

确保您使用@synthesize editingLoad;,以便为您生成所有getter 和setter。 并且不要忘记在分配值之前分配/初始化您的自定义对象:

self.editingLoad = [[LoadDescription alloc] init];
self.editingLoad.startMagnitude = tableValue;
...

【讨论】:

    【解决方案3】:

    这里您有以下问题之一: 1)您没有在自定义类中定义 init 方法。 2) 你在“editingLoad”对象中得到 nil 值。

    【讨论】:

    • 类继承自NSObject,所以定义init不应该是不必要的吗?什么时候需要在自定义类中定义 init?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2017-10-31
    相关资源
    最近更新 更多