1

まず、NSString*用にカスタマイズしたセッターを次のように作成しました。

- (void)setDateString:(NSString *)newDateString {
    self.dateString = newDateString;
    NSInteger dateNumber = [dateString integerValue];
        // this line causes crash

    // do something here..blah blah
}

次に、[XXX setDateString:]を実行するスレッドが無限に多いため、プログラムが停止します。

何回か役に立たない試みをした後、私はこの質問/回答を見つけました。

自己を使用しないでください。カスタムアクセサの内部。変数に直接アクセスし、

だから私は自分のコードを

- (void)setDateString:(NSString *)newDateString {
    //self.dateString = newDateString;
    dateString = newDateString;
    NSInteger dateNumber = [dateString integerValue];

    // do something here..blah blah
}

その後、すべてが魅力のように機能します!!


私はいくつかのObjective言語のジュニア開発者であり、Objective-Cの初心者です。

理由を理解せずに問題を解決するのではなく、この問題について詳しく学びたいと思います。

それで、これについてもっと理解するためにいくつかの資料/ウェブサイトを私に提供してください。

ところで、私はARCを使用しています。

皆さん、ありがとうございました。:)

4

3 に答える 3

3

問題は実際にはこの行ではありません:

NSInteger dateNumber = [dateString integerValue];

それはこの行です:

self.dateString = newDateString;

ご覧のとおり、等号は文字通り呼び出すことに似ており[self setDateString:newDateString](実際、コンパイラはそれを再解釈します)、無限ループを作成します。当然、その行をコメントアウトしても、そもそもそのループが作成されることはありません。

于 2012-06-14T18:51:37.057 に答える
3
self.dateString = newDateString;

と同等です

[self setDateString:newDateString];

したがって、内部で呼び出しているため、これにより無限再帰-setDateString:が発生します。

self.ivarとivarの違いも参照してください。。

于 2012-06-14T18:51:54.527 に答える
2

何が起こったのかというと、関数を何度も呼び出し続けたために、呼び出し元の関数がスタックオーバーフローに陥ってしまいました。

この行の何が問題なのですか

self.dateString = newDateString;

この行はObjectiveCプロパティであり、getterメソッドとsetterメソッドがあります。これらのメソッドは、dateStringのsetterメソッドとgetterメソッドを@synthesizeすると、自動的に生成されます。

 - (void)setDateString:(NSString *)newDateString;

 - (NSString*)dateString;

したがって、self.dateString = newDateString; この行を呼び出すと、この関数が再度呼び出されます

- (void)setDateString:(NSString *)newDateString {

そして、この関数には再びが含まれていself.dateString = newDateString;ます。スタックストレージがなくなるまで、呼び出しスタックはどんどん深くなります。

于 2012-06-14T18:52:29.007 に答える