objective-c - Objective C 内存管理问题

标签 objective-c memory-management nsstring nsarray nsobject

我知道这已经被讨论得令人作呕,但我只是不明白一些内存管理。据我所知,retain 使对象保持事件状态,而 copy 则提供对象的单独副本。

我不明白的是,当涉及到 ivars 和属性时,保留作为属性意味着 setter 释放旧值并保留新值:

property = newValue;
// retain
if (property != newValue)
{
   [property release];
    property = [newValue retain];
}

但我见过他们将静态字符串分配给保留属性 ivars 的示例,例如

self.stringProperty = @"something";
(some other code)
self.stringProperty = @"somethingElse";

第二次调用set string应该对静态字符串调用release,这是不允许的,为什么程序不会崩溃?

此外,如果一个对象是用retain属性声明的,然后用init分配一些东西,例如

@property(retain)someArray;

someArray = [[NSArray alloc] initWithArray:arbArray];

这是否意味着 someArray 现在的保留计数为 2,但如果它是使用创建的

someArray = [NSArray arrayWithArray:arbArray];

保留计数只有 1,因为第二个是工厂方法?

最佳答案

The second call to set string should call release on the static string which is not allowed, why doesn't the program crash?

您可以将 release 传递给常量字符串,它只是不会做任何有意义的事情,因此这些代码行是有效的。

does that mean someArray now has a retain count of 2 but if it was created with...the retain count is only 1 because the 2nd is a factory method?

首先,

someArray = [[NSArray alloc] initWithArray:arbArray];

不使用@property创建的方法,它只是直接访问ivar。要使用属性方法,您必须使用 self.someArray = ...;

但是,是的,

[[NSArray alloc] initWithArray:arbArray]

返回一个有效保留计数为 1 的对象,并且

[NSArray arrayWithArray:arbArray]

返回一个有效保留计数为 0 的对象,因此,如果您确实将它们传递给 @property 创建的“retain”setter,则 ivar 将有一个有效保留数分别为 2 和 1。

关于objective-c - Objective C 内存管理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3213244/

相关文章:

iphone - 从核心数据获取请求中排除反向关系

objective-c - GCD 和 for 循环

ios - 使用 NSArray/PFQuery 中的数据填充表格 View 单元格

memory-management - 运行时内存地址绑定(bind)的必要性

ios - 关于制作自定义 NSString

ios - 使用 dispatch_group 嵌套多个请求

ios - 是否可以调试 "Terminated due to memory error"?

c++ - C++ 删除操作符如何找到多态对象的内存位置?

iOS:重命名 NSString 以进行循环

iphone - 发行时NSString崩溃