2010-12-29 10 views
1

私は自分自身を可能な限り明確にしようとします。最初から始めましょう。私は、myLocationからの距離を持つ場所のリストを含むテーブルビューを持つアプリケーションを持っています。今、毎回私は今、私は唯一のdistanceStringアプリケーションのクラッシュを使用している場合、コードの今、この作品[trek setDistanceUnit];通話Iphoneアプリケーション。自己キーワードなしのクラッシュ

-(void) setDistanceUnit { 

if (self.distance < 1000.0) 
    self.distanceString = [NSString stringWithFormat:@"%.0lf m", self.distance]; 
} 

次のコード

- (void)locationUpdate:(CLLocation *)location { 
myLocation = location; 
for (Trek * trek in list) { 
    CLLocation *loc = [[CLLocation alloc] initWithLatitude:[trek latitude_start]    longitude:[trek longitude_start]]; 
    double dis = [locationManager getDistance: loc]; 
    [trek setDistance:dis]; 
    [trek setDistanceUnit]; 
    [loc release]; 
} 

[self.tableView reloadData]; 
} 

を実行するGPS位置での更新を取得します。今私は、それらの更新がビューをセルを描画するために必要なアクセスと同時に(並行して)実行できるという事実と関係があると考えています。誰もが考えている?参考になったらもっと多くのコードを投稿することができます。この投稿を長くするにはあまりにも多くの投稿をしたくないだけです。

どこでも検索しようとしましたが、これまで何も見つかりませんでした。事前に

おかげで、 ウンベルト

PSこれでアプリケーションが動作しているが、私は何が起こっているかを理解したいと思います。

+0

'self'はキーワードではなく、暗黙の変数です。関数のようにメソッド実装の外で変数名 'self'を使うことができます。 – dreamlax

答えて

5

distanceStringがretainプロパティの場合、selfを付けずに割り当てると、セッターをバイパスし、文字列を保持せずに割り当てられるため、クラッシュするように設定されます。だから、文字列が自動解放プールに送られたときに割り当て解除されると、あなたのアプリはクラッシュします。

@synthesizeを使用してアクセサを合成し、ドット表記(またはsetDistanceString:)を使用すると、オブジェクトは文字列を保持します。

+4

これは私がドット表記を嫌う理由の1つです。ドット演算子と代入演算子の両方にあいまい性が追加されます。 – dreamlax

+0

@dreamlax:ええ、設定時には常に 'self.propName ='の代わりに '[self setPropName:'を使います。 – BoltClock

+0

あるいは、私はいつでもインスタンス変数の先頭に '_'をつけ、' @synthesize foo = foo_; 'を使用します。 – bbum

関連する問題