Ios 初始化NSString对象两次是否有任何隐藏的副作用

Ios 初始化NSString对象两次是否有任何隐藏的副作用,ios,objective-c,Ios,Objective C,如果我们初始化NSString对象两次,是否有任何问题或副作用 NSString *str = [[NSString alloc] init]; str = [str init]; “init”方法需要通过将所有成员设置为0或nil来初始化对象,而不需要其他任何设置。就像[SomeClass alloc]的结果一样 给init打两次电话会给你带来各种恶劣的副作用。例如,如果第一个init分配了内存,那么第二个init很可能会导致内存泄漏。更糟糕的事情可能会发生。如果你现在没有看到任何不好的事情

如果我们初始化NSString对象两次,是否有任何问题或副作用

NSString *str = [[NSString alloc] init];
str = [str init];
“init”方法需要通过将所有成员设置为0或nil来初始化对象,而不需要其他任何设置。就像[SomeClass alloc]的结果一样


给init打两次电话会给你带来各种恶劣的副作用。例如,如果第一个init分配了内存,那么第二个init很可能会导致内存泄漏。更糟糕的事情可能会发生。如果你现在没有看到任何不好的事情发生,你可以打赌在下一个MacOS或iOS版本中将会发生一些不好的事情。

在已经初始化的对象上调用
init
是未定义的行为。从:

一个程序在同一对象上引起两个或多个对
init
方法的调用是未定义的行为,但每个
init
方法调用最多可以执行一个委托init调用


您所做的操作可能会使程序崩溃或导致数据损坏。不要这样做。

第二行是非法的。就这么简单。在说
alloc
的同一行之外的任何地方说
init
都是非法的。在同一行中说
alloc
而不说
init
是非法的。只需遵循规则即可。@matt编译器肯定会让您自己调用alloc,并让您将结果传递给另一个调用init的方法。(这很可怕,但我已经看到它完成了,并且它工作了。只要你有一个alloc+一个init)。如果第二行是非法的,那么为什么不编译时错误或者至少编译器应该给出警告呢?编译器不需要对未定义的行为发出诊断(尽管它确实有帮助)。也许可以检测到重复的
init
;我还没试过。您可以在Xcode方案编辑器的“诊断”选项卡中启用UBSan。@马特分割alloc init作为模式是错误的,当然。但不是错误的或未定义的。
+alloc
-init
都是方法分派,就像任何其他方法分派一样,它们绝对没有什么特别之处。(当然,多次调用
init
实际上是完全错误和未定义的)。