自己修正するカテゴリのジレンマをNSStringの
-
19-09-2019 - |
質問
両方の仕事が、その一つは、あなたが使用すると、なぜ?
@implementation NSString (Extender)
-(NSString *) stringByTrimmingPrefix:(NSString *)strPrefix
{
while ([self hasPrefix:strPrefix])
{
self = [self substringFromIndex:strPrefix.length];
}
return self;
}
@end
または
@implementation NSString (Extender)
-(NSString *) stringByTrimmingPrefix:(NSString *)strPrefix
{
NSString *returnValue = [NSString stringWithString:self];
while ([returnValue hasPrefix:strPrefix])
{
returnValue = [returnValue substringFromIndex:strPrefix.length];
}
return returnValue;
}
@end
解決
オプション#2。
のNSStringは不変オブジェクトであることが意図されます。 NSStringの上の標準「stringBy」のすべての方法は、新しい自動解放NSStringsを返します。
#1はまた、新しいNSStringのを返してしまいますが、それは最高の状態で、意味的に正しくないと最悪の不変オブジェクトになるはずだったものの参照されるオブジェクトを変更することである。
他のヒント
まず、あなたのObjective-Cのメソッド定義は、このCの関数とまったく同じです
NSString* stringByTrimmingPrefix(NSString* self, SEL _cmd, NSString* strPrefix)
{
...
}
あなたが見ることができるように、self
はちょうど別の関数のパラメータです。あなたが欲しいものにそれを再割り当てすることができ、それは元のNSString *インスタンスそれは元々に指していた。状態には影響しません。
ですから、その点では、あなたの最初の実装でやっていると間違って何もありません。
ただし、どちらもあなたの実装のは、非常に効率的であり、両方のバグを持っている(あなたが複数の文字と接頭辞を渡すとどうなるか?)
私は<のhref = "http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html#//apple_ref/occ/instmを使用します/ NSStringの/ rangeOfString:オプション:範囲:」のrel = "nofollowをnoreferrer"> rangeOfString:オプション:範囲:あなたが唯一最大1つの余分にNSStringのインスタンスを作成しているようにには、あなたのプレフィックスを見つけるために、
。これはちょうど(その文字が複数回ある場合、それがある限り多くをカットします)は、文字列の先頭から単一の手紙をオフにチョップ?
NSStringのは不変なので、、私は違いのいずれかの方法で、パフォーマンスが賢明ではありません。最初のケースでは、新しい文字列オブジェクトで毎回自己を交換する、第2の場合には、新しい文字列オブジェクトで毎回のreturnValueを交換しています。最初のオプションは、私はそのいずれかを使用するコードの行が保存されますので、私は推測します。