我有一个模型。
我想在初始化后每3秒更新一个属性,我需要以后更改另一个视图控制器中的属性。
代码是:
模型
@interface Ap : NSObject
@property (nonatomic, retain) NSString *address;
@property (nonatomic, retain) NSString *sessionId;
+ (id)sharedInstance;
@end
@implementation Ap
@synthesize sessionId, address;
-(id) init {
if (self = [super init]) {
self.address = nil;
self.sessionId = nil;
[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(heartbeat) userInfo:nil repeats:YES];
}
return self;
}
-(void) updateSession{
sessionId = @"some string";
}
- (void) update{
self.sessionId = @"some value from network";
}
+ (Ap *)sharedInstance {
if (!sharedInstance) {
sharedInstance = [[super allocWithZone:NULL] init];
}
return sharedInstance;
}
@end
控制器
- (void) viewDidLoad {
[super viewDidLoad];
[[Ap sharedInstance] updateSession];
}
错误是: (lldb) bad access
当模型更新
我将更新方法更改为
-(void) updateSession{
self.sessionId = @"some string";
}
错误消失了,谁能告诉我为什么?
您应该在应用程序委托中使用self.ap = [[Ap alloc] init];
。当您尝试在可能导致崩溃的情况下调用update
时,您的模型对象可能会被释放。
您的代码看起来像这样,
@interface SomeAppDelegate : UIResponder{
@property(nonatomic, retain) Ap *ap; //declare property here
@end
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if(!self.ap){
self.ap = [[Ap alloc] init]; //use property here as self.ap which will retain ap. Otherwise it will not retain it.
}
}
更新:看来您已经删除了上一个问题,并为上一个问题添加了一个全新的问题。无论如何,我也会尝试回答这个。
错误消失了,谁能告诉我为什么?
原因与我上面提到的相同。如果使用self.sessionId = @"some string";
,则保留对象。因为它是财产,并且由于您已将该财产保留为保留,因此财产将在内部保留。但是,如果您使用sessionId = @"some string";
,则它的范围仅在该方法内部,因为您不使用该属性。您直接设置该值而无需调用属性,并且该方法将在该方法之后自动发行。因此,您将获得bad access
。
我建议您浏览Apple文档,以了解有关属性及其工作的更多信息。