在自定义setter中自动修剪NSString?

时间:2012-09-17 01:01:31

标签: objective-c ios nsstring setter getter-setter

我有一个带有NSString属性的对象。我想为此属性使用自定义setter,以便在设置字符串时始终修剪所有空格。

通常这是使用NSString *blah2 = [blah stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];完成的,但我不确定如何为自定义设置器制定此功能。在setter中使用这样的自动释放对象不是很糟糕吗?我应该使用可变字符串,然后将其转换为不可变吗?

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分: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
    }
}

在setter中,我会在有人试图提供NSMutableString的实例的情况下复制setter的参数 - 假设Foo不希望修改原始字符串。

修改: 或者,如果手动引用计数,则setter可能是:

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