首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存管理ios7

内存管理ios7
EN

Stack Overflow用户
提问于 2014-02-17 12:24:08
回答 3查看 723关注 0票数 0

我有以下代码:

代码语言:javascript
复制
- (IBAction)HeyCount:(UIButton *)sender {
    NSString* strr = [[NSString alloc] initWithString:@"hi there"];
    self.string = @"789";
    ohYeah = @"456";
    NSLog(@"Retain Count of ohYeah:[%d] with String:[%ld]",[ohYeah retainCount],(long)[ohYeah integerValue]);
    NSLog(@"Retain Count of strr:[%d] with String:[%ld]",[strr retainCount],(long)[strr integerValue]);
}

上述代码的输出如下:

代码语言:javascript
复制
Retain Count of ohYeah:[-1] with String:[456]

Retain Count of strr:[-1] with String:[0]

ohYeah的声明在.h文件中

代码语言:javascript
复制
NSString * ohYeah;

我不使用ARC。你们中有人能解释为什么retain count of strings-1,而使用retain count -1访问对象不应该崩溃吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-17 12:33:17

我想编译器是聪明的,并从给定的代码中创建字符串文本。因为它们驻留在自己的内存空间中,并且从未被释放,所以它们得到了UINT_MAX的保留计数。使用%d打印的UINT_MAX将导致-1。对无符号整数使用%u。

票数 3
EN

Stack Overflow用户

发布于 2014-02-17 12:29:21

您不应该密切关注retainCount。

有些对象,如常量字符串,不参与保留/释放机制。例如,@"456“是这样一个常量字符串。你可以随心所欲地释放或保留它,什么都不会发生。

还有其他像@123这样的对象,它们甚至不是64位系统中的对象。它们的行为就像对象,但是从来没有为它们分配过内存。

在这两种情况下,保留数都不会给出任何合理的结果。这就是为什么你非常非常罕见地看到保留数。

还有一些方法,比如“复制”,有时复制一个对象,有时只保留原来的对象。因此,如果您有一个对象,其保留计数为100,并且您复制了一个副本,则该副本的保留计数可能为1或101。

票数 0
EN

Stack Overflow用户

发布于 2014-02-17 12:37:16

注意,retainCount在NSObject.h中是这样声明的

代码语言:javascript
复制
- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;

您应该使用%u在32位架构上显示它,在64位上使用%lu。但是您不应该直接使用retainCount,在代码中使用它意味着您有一个体系结构问题,目标-c (ARC或手动参考计数)提供了一套完整的机制来正确管理内存和对象生命周期。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21829047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档