我一直在搞乱一些代码,试图在objective-c中了解指针和内存管理。但是,我似乎无法理解的是使用此代码:
hello *myHello = [[hello alloc] init];
NSString *string = @"Hello";
myHello.property = string;
NSString实例(@“Hello”)是否作为参数传递给setter方法或指针是否被发送。例如,如果我将“string”更改为指向另一个对象,然后获取变量,它仍然是“Hello”或更改为“string”指向的新对象? 提前谢谢!
答案 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”。