我有一个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.我错过了什么?我猜它没有调用它,也许是因为它的一个实例?有什么快速提示吗?
答案 0 :(得分:4)
我没有看到您将视图控制器的datas
属性(或_datas
ivar)设置为modeler
类的实例。如果没有发生这种情况,_datas.abc
是一条消息为nil - 因此将其用作setter什么都不做,并将其用作getter返回0。
此外,您在abc
类上声明def
和modeler
为ivars,然后声明具有相同名称但不同的ivars(_abc
和_def
)。这几乎肯定不会引起你所看到的问题,但后来肯定会导致混乱。最好不要声明ivars(并让@synthesize
指令处理)或不在@synthesize
指令中指定ivars(以便默认使用同名的ivars)。我倾向于选择前者。
此外,它也可能与您的问题没有关联,但使用生成的访问器而不是ivars通常是一件好事,除非您有充分的理由不这样做。 (也就是说,使用self.datas
代替datas
。)
答案 1 :(得分:3)
您告诉编译器在@synthesize指令中使用变量_abc
和_def
,因此setter不会触及实例变量abc
和def
。我没有看到确切的问题,但是你肯定会让自己和/或编译器感到困惑,因为它们具有相同名称的属性和实例变量,但是使用不同的ivars来支持属性。此外,请尝试不要直接访问ivars,就像您在最后一个代码段中使用_datas
一样。您已创建了访问者,因此请使用它们。一旦你完成了,我希望你的问题会消失。