gpt4 book ai didi

iphone - NSMutableString 和 NSString 的类别导致绑定(bind)困惑?

转载 作者:行者123 更新时间:2023-12-03 16:26:34 24 4
gpt4 key购买 nike

我已经使用类别通过一些方便的方法扩展了 NSString 和 NSMutableString。这些添加的方法具有相同的名称,但具有不同的实现。例如,我已经实现了 ruby​​“strip”函数,该函数删除两个端点处的空格字符,但对于 NSString 它返回一个新字符串,对于 NSMutableString 它使用“deleteCharactersInRange”来删除现有字符串并返回它(就像 ruby 条!)。

这是典型的标题:

@interface NSString (Extensions)
-(NSString *)strip;
@end

@interface NSMutableString (Extensions)
-(void)strip;
@end

问题是,当我声明 NSString *s 并运行 [s strip] 时,它会尝试运行 NSMutableString 版本并引发扩展。

NSString *s = @"   This is a simple string    ";
NSLog([s strip]);

失败:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to mutate immutable object with deleteCharactersInRange:'

最佳答案

你被一个实现细节所困扰:一些 NSString 对象是 NSMutableString 子类的实例,只有一个私有(private)标志控制该对象是否可变。

这是一个测试应用程序:

#import <Foundation/Foundation.h>

int main(int argc, char **argv) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSString *str = [NSString stringWithUTF8String:"Test string"];
NSLog(@"%@ is a kind of NSMutableString? %@", [str class], [str isKindOfClass:[NSMutableString class]] ? @"YES" : @"NO");

[pool drain];
return EXIT_SUCCESS;
}

如果您在 Leopard 上编译并运行它(至少),您将得到以下输出:

NSCFString is a kind of NSMutableString? YES

正如我所说,该对象有一个私有(private)标志来控制它是否可变。由于我使用的是 NSString 而不是 NSMutableString,因此该对象是不可变的。如果你尝试改变它,就像这样:

NSMutableString *mstr = str;
[mstr appendString:@" is mutable!"];

您将得到(1)一个当之无愧的警告(可以通过强制转换来消除该警告,但这将是一个坏主意)和(2)您在自己的应用程序中遇到的相同异常。

我建议的解决方案是将你的突变条包裹在 @try 中。 block ,并调用 return [super strip] 中的 NSString 实现( @catch ) block 。

此外,我不建议为该方法提供不同的返回类型。我会让变异者返回 self ,例如retainautorelease做。然后,您可以随时执行以下操作:

NSString *unstripped = …;
NSString *stripped = [unstripped strip];

不用担心是否 unstripped是否是可变字符串。事实上,这个例子很好地说明了您应该删除变异 strip完全,或重命名复制stripstringByStripping或其他东西(类比 replaceOccurrencesOfString:…stringByReplacingOccurrencesOfString:… )。

关于iphone - NSMutableString 和 NSString 的类别导致绑定(bind)困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1242335/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com