3

これは私には意味がありません。たぶん、ここの誰かがこれが起こる理由を説明できるでしょう。

iPhone アプリの先頭に割り当て、プロセスの後半で追加する NSMutableString があります。その結果、SIGABRT が発生しますが、これは私には当てはまりません。コードは次のとおりです。

ヘッダー ファイル (簡略化):

@interface MyAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    NSMutableString *locationErrorMessage;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, copy) NSMutableString *locationErrorMessage;

@end

そして、メインの関連部分:

@implementation MyAppDelegate

@synthesize window;
@synthesize locationErrorMessage;

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    self.locationErrorMessage = [[NSMutableString alloc] init];  
}

- (void)anotherFunction {
    [self.locationErrorMessage appendString: @"Blah Blah Blah"];
}

これはすべて簡単に思えます。私は何が欠けていますか?

4

3 に答える 3

5

私はこれをプロパティ セッターの生成方法のバグと呼んでいますが、答えは非常に簡単です。

プロパティを として宣言しました(nonatomic, copy)。これは、locationErrorMessageプロパティが設定されるたびcopyに、新しい値で呼び出され、そのコピーをプロパティ値として使用することを意味します。

残念ながら、 を呼び出しcopyてもNSMutableStringは発生せず、 が発生NSMutableStringしますNSString( のようなものを使用して変更することはできませんappendString:)。

したがって、簡単な修正は、プロパティ宣言を から に変更するcopyことretainです。

(バグは次のようになると思います: 可変オブジェクトのプロパティを として宣言した場合copy、コピー セッターは実際には を使用し、 を使用mutableCopyしないでくださいcopy) => rdar://8416047

于 2010-09-10T16:23:36.937 に答える
2

あなたのプロパティは、渡された文字列をコピーしています。appendString:コピーは常に不変であるため、不変に送信しようとしていますNSString。プロパティを として宣言するretainと、それが機能するか、 を使用して文字列をコピーするカスタム セッターが作成されますmutableCopy

メモリリークもあります。シーケンス[NSMutableString string]の代わりに使用する必要があります。alloc-init

于 2010-09-10T16:23:59.023 に答える
0

ところで、そこに漏れがあります。

self.locationErrorMessage = [[NSMutableString alloc] init];

値をコピーしていますが、実際に最初に割り当てられた NSMutableString を解放することはありません。

于 2011-12-16T15:15:57.080 に答える