在一个方法中,指针或实际对象是否作为参数传递?

时间:2013-01-09 20:50:59

标签: objective-c cocoa pointers methods

我一直在搞乱一些代码,试图在objective-c中了解指针和内存管理。但是,我似乎无法理解的是使用此代码:

hello *myHello = [[hello alloc] init];

NSString *string = @"Hello";

myHello.property = string;

NSString实例(@“Hello”)是否作为参数传递给setter方法或指针是否被发送。例如,如果我将“string”更改为指向另一个对象,然后获取变量,它仍然是“Hello”或更改为“string”指向的新对象? 提前谢谢!

2 个答案:

答案 0 :(得分:1)

Jim有一个很好的答案,但我想添加一个视觉效果,因为它可能对人们有所帮助。

Say * string = @“test”

字符串指向存储@“test”

的内存位置

从根本上说,它看起来像这样:

      @"test"
        ^
string /

当你这样做时:

myHello.property = string;

你只是将属性设置为相同的地方字符串,就像这样;

     @"test"
        ^
string /  \ property

然后,如果你以后改变字符串说@“hello”你在内存中创建另一个位置,并保留另一个。现在就是这样。

      @"hello"  @"test"
        ^         ^
string /           \ property 

属性被篡改的唯一方法是使用指针搞乱。因为这可能永远不会发生,所以你不必担心它。

有些新手认为这会导致记忆问题,但事实并非如此。 ARC可以告诉您何时完成了属性,它将删除内存本身。

希望有所帮助!

答案 1 :(得分:0)

当你这样做时:

myHello.property = string;

如果属性定义为复制,则会将其设置为指向字符串指向的相同位置。

如果使用复制定义属性,则会将其设置为指向原始字符串的新副本。

在任何一种情况下,如果您随后将字符串更改为指向其他字符串(例如@“Goodbye”),属性仍将指向@“Hello”。