gpt4 book ai didi

ios - 带有类别的 nil 对象上的 setString

转载 作者:行者123 更新时间:2023-11-28 18:35:08 27 4
gpt4 key购买 nike

在我看来,它像是将 setString: 发送到一个 NSMutableString ,它还没有调用 init 还没有调用 init 是它自己的。例如:

NSMutableString *string;   // Declare, but do not init yet
[string setString:@"foo"];
NSLog (@"%@",string); // Prints "(null)"

我想覆盖这个行为,所以基本上

- (void) setString:(NSString *)aString
{
if (!self)
{
self = [self initWithString:aString];
}
else
{
[super setString:aString];
}
}

我可以用一个子类来做到这一点,但我必须检查我的项目并用我的子类替换我所有的 NSMutableString,这很痛苦。我在看Apple Docs看起来我想要做的是为 NSMutableString 创建一个类别。我以前没有使用过类别,所以我有几个问题:

首先,类别似乎只允许我添加新方法,不允许我覆盖现有方法。我想创建一个 setStringWithInit: 方法来做我想做的事情就足够容易了,所以第一个问题毕竟不是真正的问题(尽管我仍然需要通过查找替换我的 setString 项目,但是哦,好吧)。

其次,更重要的是,我如何检查我的新方法的发送者是否为 nil?如果 setString: 返回的不是 void,我想我可以让它工作,但这里不是这种情况。如何从上面的代码中获取 if (!self) 检查以处理类别?

或者类别不是处理这种事情的方法,毕竟我最好还是进行子类化?

编辑:所以我使用它的字符串实际上是自定义 NSObject 子类的 @property。在我的代码中,我实际上会调用 [myObject.someProperty setString:@"foo"];,当我尝试时,调试器向我显示 someProperty 为 nil去做这个。此外,在我的应用程序的其他部分,我正在检查 if (!myObject.someProperty) 以查看该属性是否已被使用,所以我不想自动 self. someProperty = [[NSMutableString alloc] init];myObject 类的 init 方法中。

尽管现在我考虑了一下,我认为我可以将 if (!myObject.someProperty) 替换为 if ([myObject.someProperty length] == 0),这将允许我立即完成并分配初始化。但是,如果我立即初始化所有内容,那将为它创建一些内存空间,对吗?虽然它可能可以忽略不计。嗯,也许这才是我应该做的。

最佳答案

正确的代码应该是:

NSMutableString *string = [NSMutableString string];
[string setString:@"foo"];
NSLog (@"%@",string);

为什么不初始化变量?无需覆盖 setString: 或任何其他方法。不要试图将 NSMutableString 与任何其他类区别对待。

此外,重写 setString: 仍然解决不了任何问题。只要指针为 nil,就不能对其调用方法。

关于ios - 带有类别的 nil 对象上的 setString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20551406/

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