1

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

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

模型.h

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

模型.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。我错过了什么?我猜它没有调用它,也许是因为它的一个实例?有什么快速提示吗?

4

2 回答 2

4

我看不到您在哪里将视图控制器的datas属性(或ivar)设置为您的类_datas的实例。modeler如果这没有发生,_datas.abc则向 nil 发送一条消息——因此将其用作 setter 不会执行任何操作,并将其用作 getter 返回 0。

此外,您在您的类上声明abcdef作为 ivars modeler,然后声明具有相同名称但不同 ivars (_abc_def) 的属性。这几乎可以肯定不会导致您看到的问题,但以后肯定会导致混乱。最好不要声明 ivars(并让@synthesize指令负责)或不在@synthesize指令中指定 ivars(以便默认使用同名的 ivars。我更喜欢前者。

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

于 2012-05-06T17:30:27.670 回答
3

您是在告诉编译器使用变量_abc_def在 @synthesize 指令中,因此设置器不会触及实例变量abcdef. 我没有看到确切的问题,但是您肯定会混淆自己和/或编译器,因为属性和实例变量具有相同的名称,但使用不同的 ivars 来支持属性。此外,尽量不要直接访问 ivars,就像您_datas在最后一个片段中所做的那样。您已经创建了访问器,因此请使用它们。一旦你这样做了,我希望你的问题会消失。

于 2012-05-06T16:52:49.290 回答