Setters / Getters没有设置/获取

时间:2012-05-06 16:50:26

标签: iphone objective-c ios5

我有一个model.h和model.m来保存各种视图控制器访问数据的数据和变量(使用MVC)。问题是,当我尝试设置并从中获取变量时,它们总是为0.我显然做错了什么,但不知道。

这是我的model.h和model.m(更改了名称,因此更容易。

model.h

@interface modeler : NSObject
{
   int abc;
   int def;
}
@property (nonatomic,assign) int abc;
@property (nonatomic,assign) int def;

model.m

#import "modeler.h"
@interface modeler()
@end
@implementation modeler
@synthesize abc = _abc;
@synthesize def = _def;

这就是我如何设置两个变量,这里是视图控制器。 vc.h

#import "modeler.h"
@interface vcViewController : UITableViewController
@property (nonatomic,strong) modeler *datas;
@end

vc.m

@interface vcViewController ()
@end
@implementation vcViewController
@synthesize datas = _datas;

这就是我试图在vc.m

中设置它们的方式
NSIndexPath *selectedRowIndex = [self.tableView indexPathForSelectedRow];
NSLog(@"1-%i",selectedRowIndex.row);
_datas.abc = selectedRowIndex.row;
NSLog(@"2-%i",_datas.abc);

所选行打印出2,但_data.abc始终为0.我错过了什么?我猜它没有调用它,也许是因为它的一个实例?有什么快速提示吗?

2 个答案:

答案 0 :(得分:4)

我没有看到您将视图控制器的datas属性(或_datas ivar)设置为modeler类的实例。如果没有发生这种情况,_datas.abc是一条消息为nil - 因此将其用作setter什么都不做,并将其用作getter返回0。

此外,您在abc类上声明defmodeler为ivars,然后声明具有相同名称但不同的ivars(_abc_def)。这几乎肯定不会引起你所看到的问题,但后来肯定会导致混乱。最好不要声明ivars(并让@synthesize指令处理)或不在@synthesize指令中指定ivars(以便默认使用同名的ivars)。我倾向于选择前者。

此外,它也可能与您的问题没有关联,但使用生成的访问器而不是ivars通常是一件好事,除非您有充分的理由不这样做。 (也就是说,使用self.datas代替datas。)

答案 1 :(得分:3)

您告诉编译器在@synthesize指令中使用变量_abc_def,因此setter不会触及实例变量abcdef 。我没有看到确切的问题,但是你肯定会让自己和/或编译器感到困惑,因为它们具有相同名称的属性和实例变量,但是使用不同的ivars来支持属性。此外,请尝试不要直接访问ivars,就像您在最后一个代码段中使用_datas一样。您已创建了访问者,因此请使用它们。一旦你完成了,我希望你的问题会消失。