为一个模型分配Attibute时,为什么需要添加自我



我有一个模型。

我想在初始化后每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文档,以了解有关属性及其工作的更多信息。

最新更新