0

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

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

NSString *string = @"Hello";

myHello.property = string;

NSString 实例 (@"Hello") 是作为参数传递给 setter 方法还是发送指针。例如,如果我将“string”更改为指向不同的对象,然后得到变量,它仍然是“Hello”还是更改为“string”指向的新对象?提前致谢!

4

2 回答 2

1

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

说 *string = @"test"

字符串指向存储@“test”的内存位置

基本上,它看起来像这样:

      @"test"
        ^
string /

当你这样做时:

myHello.property = string;

您只是将属性设置为与字符串相同的位置,如下所示;

     @"test"
        ^
string /  \ property

然后,如果您稍后将字符串更改为 @"hello" 您在内存中创建另一个位置,并保留另一个。现在是这样的。

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

唯一可以篡改属性的方法是你弄乱了指针。由于这可能永远不会发生,因此您无需担心。

一些新手认为这会导致内存问题,但事实并非如此。ARC 可以判断您何时完成了属性,并且它会删除内存本身。

希望有帮助!

于 2013-01-09T21:17:27.880 回答
0

当你这样做时:

myHello.property = string;

如果property没有定义copy,它被设置为指向string指向的同一个地方。

如果property使用copy定义,则将其设置为指向原始字符串的新副本。

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

于 2013-01-09T20:59:51.440 回答