1

我有一个模型。

我想在初始化后每 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模型更新时

我将 updateSession 方法更改为

     -(void) updateSession{
        self.sessionId = @"some string";
     }

错误消失了,谁能告诉我为什么?

4

1 回答 1

1

您应该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.

我建议您阅读苹果文档以了解有关属性及其工作的更多信息。

于 2012-12-25T09:16:20.943 回答