1

私は1つのモデルを持っています。

初期化後 3 秒ごとに 1 つの属性を更新したいのですが、後で別のビュー コントローラーで属性を変更する必要があります。

コードは次のとおりです。

モデル

 @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

プロパティとその動作について詳しく理解するには、Apple のドキュメントを参照することをお勧めします。

于 2012-12-25T09:16:20.943 に答える