iPhoneのクラス間で値を転送する方法は?
-
03-07-2019 - |
質問
あるクラスから別のクラスに文字列を送信したい:
1)class1に、文字列を保持するプロパティを追加します:
@property (nonatomic, retain) NSString *str;
2)および文字列を送り返す方法:
-(NSString *)sendBackStr:(NSString *)strURL
{
NSString *str = [[NSString alloc] stringWithString:strURL];
return str;
}
3)クラス2で、受信した文字列を保持するプロパティを追加します。
@property (nonatomic, retain) NSString *returnStr;
4)および次のコード:
Class1 *c1 = [[Class1 alloc] init];
returnStr = [c1 sendBackStr:@"URL"];
ただし、プログラムはreturnStr = [c1 sendBackStr:@" URL"];で停止します。何が問題なのか考えはありますか?
解決
stringWithStringは、自動解放された文字列を返すクラスメソッドです。次のように呼び出す必要があります。
myProperty = [NSString stringWithString:strURL];
ここでは、stringWithStringメソッドから返される自動解放された文字列の保持カウントをインクリメントするために、プロパティがコピーを行うと仮定しています。 (alloc呼び出しから返されたオブジェクトの保持カウントは1であり、自動解放されません。)文字列に保持プロパティではなくコピープロパティを指定するのがより一般的です。通常は、他の誰かが所有する文字列。
私も理解できないのは、単なる例でない限り、なぜこのようなコードを書いたのかということです。クラス2では、書く必要があるのは
returnStr = [NSString stringWithString:@"URL"];
他のヒント
stringWithString:は、NSStringクラスに送信する必要があるメッセージであり、クラスのインスタンスではありません(allocを介して返されます)。
正しいコードは次のとおりです。
-(NSString *)sendBackStr:(NSString *)strURL
{
return [NSString stringWithString:strURL];
}
ポインタの割り当て、保持、および自動解放に関するイディオムについてもっと詳しく知りたいかもしれません。何らかの理由でこの文字列を割り当てて、sendBackStr:メッセージから返す場合は、おそらく次のコードが必要です。
-(NSString *)sendBackStr:(NSString *)strURL
{
return [[[NSString alloc] initWithString:strURL] autorelease];
}
所属していません StackOverflow