0

プロパティのNSStringを持つオブジェクトがあります。このプロパティにカスタムセッターを使用して、文字列が設定されたときに常にすべての空白をトリミングするようにしたいと思います。

通常、これはで行われNSString *blah2 = [blah stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];ますが、カスタムセッター用にこれを作成する方法がわかりません。セッターでこのような自動解放されたオブジェクトを使用するのは悪いことではありませんか?代わりに可変文字列を使用してから、それを不変に変換する必要がありますか?

あなたたちが提供できるどんな助けにも感謝します。

4

1 に答える 1

3

ARCを想定します。

#import <Foundation/Foundation.h>

@interface Foo:NSObject
@property (nonatomic,copy) NSString *myString;
@end

@implementation Foo
@synthesize myString = _myString;

- (void)setMyString:(NSString *)aString;
{
    _myString = [[aString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] copy];
}

@end

int main(int argc, char *argv[]) {
    @autoreleasepool {
        Foo *someFoo = [[Foo alloc] init];
        someFoo.myString = @"Blah     ";
        NSLog(@"Length = %ld",[[someFoo myString] length]);  // prints 4
    }
}

セッターでは、誰かが-のインスタンスを提供しようとした場合に備えて、セッターのパラメーターをコピーします。これは、元の文字列を変更することが期待されていないことをNSMutableString前提としています。Foo

編集:または、手動の参照カウントの場合、セッターは次のようになります。

- (void)setMyString:(NSString *)aString;
{
    if( aString != _myString ) {
        [_myString release];
        _myString = [[aString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] copy];
    }
}
于 2012-09-17T01:20:46.083 に答える