Objective-C 对象是按值传递还是按引用传递?
Posted
技术标签:
【中文标题】Objective-C 对象是按值传递还是按引用传递?【英文标题】:Are Objective-C Objects Pass By Value or Pass By Reference? 【发布时间】:2015-06-12 17:47:43 【问题描述】:所以我有类似的东西:
- (void) printString:(NSString *)string
NSLog(@"%@", string);
NSString *string = @"Blach";
[self printString:string];
string
是通过值还是引用传递? NSError 之类的呢?
NSError *error = [NSError errorWithDomain:someDomain
code:-101
userInfo:someInfo];
-(NSString *) doSomething:(BOOL) val withError:(NSError **)error
if(!val)
*errorPtr = [NSError errorWithDomain:something
code:-101
userInfo:someInfo];
【问题讨论】:
您应该从您的 C 基础知识中知道,Objective-C objects 是通过 reference 传递的。如果你不懂 C,那么你不应该与 Objective-C 混在一起。 @HotLicks C 的基础知识并没有教任何关于 Objective-C 对象(或任何其他 Objective-C 特定特性)如何表现的内容。 C 教的唯一一件事(关于这个问题)是对象 pointers 是按值传递的(就像所有参数一样)。 【参考方案1】:您可以永远通过指针以外的任何方式引用 Objective-C 对象,因此对于所有意图和目的,一切都是通过引用传递的。也就是说,实际的指针值是按值传递的,就像在 C 中一样。
【讨论】:
意图?? :P。 ios 范围内的意图是什么??【参考方案2】:对象通过引用传递。在我看来,重要的区别是被调用的方法是否引用了与调用者相同的对象,或者它是否具有副本。它引用了同一个对象。
如果对象是可变的并且被调用的方法改变了它,它也会影响调用者拥有的对象(因为它是同一个对象)。
在NSError**
参数的情况下,它实际上是通过引用传递的指针(不是对象)。带有这种参数的方法实际上可以修改调用者的指针,使其指向不同的对象。
【讨论】:
【参考方案3】:Objective-C 中每种类型的一切都是仅按值传递。
这个问题是无效的,因为“对象”不是 Objective-C 中的值,因此不能被“传递”——你不能有一个变量或表达式的值“是一个对象”(裸对象类型不允许在语言)——相反,“对象”必须始终在指向对象的指针后面进行操作。由于“对象”不是值,不能“传递”它们,所以问它们是“按值传递”还是“按引用传递”是没有意义的。
【讨论】:
感谢您的澄清。以上是关于Objective-C 对象是按值传递还是按引用传递?的主要内容,如果未能解决你的问题,请参考以下文章