Objective c 内存管理ios7

Objective c 内存管理ios7,objective-c,ios7,retaincount,Objective C,Ios7,Retaincount,我有以下代码: - (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

我有以下代码:

- (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]);
}
上述代码的输出为:

Retain Count of ohYeah:[-1] with String:[456]

Retain Count of strr:[-1] with String:[0]
ohYeah的声明在.h文件中

NSString * ohYeah;

我没有使用
ARC
。你们谁能解释一下为什么
retain count
两个
字符串的
retain count
都是
-1
并且使用
retain count
访问对象不应该崩溃?

你们不应该仔细查看retainCount

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

还有一些像@123这样的对象甚至不是64位系统中的对象。它们的行为类似于对象,但从来没有为它们分配内存

在这两种情况下,retain计数都不会给出任何合理的结果。这就是为什么很少有人会看到保留计数


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

你不应该仔细看重新计数

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

还有一些像@123这样的对象甚至不是64位系统中的对象。它们的行为类似于对象,但从来没有为它们分配内存

在这两种情况下,retain计数都不会给出任何合理的结果。这就是为什么很少有人会看到保留计数


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

你不应该仔细看重新计数

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

还有一些像@123这样的对象甚至不是64位系统中的对象。它们的行为类似于对象,但从来没有为它们分配内存

在这两种情况下,retain计数都不会给出任何合理的结果。这就是为什么很少有人会看到保留计数


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

你不应该仔细看重新计数

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

还有一些像@123这样的对象甚至不是64位系统中的对象。它们的行为类似于对象,但从来没有为它们分配内存

在这两种情况下,retain计数都不会给出任何合理的结果。这就是为什么很少有人会看到保留计数


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

我猜编译器很聪明,可以从给定的代码中创建字符串文本。由于它们驻留在自己的内存空间中,并且从未释放,因此它们会得到一个UINT_MAX的保留计数。用%d打印的UINT_MAX将导致-1。使用%u表示无符号整数。

我想编译器很聪明,可以从给定代码中创建字符串文字。由于它们驻留在自己的内存空间中,并且从未释放,因此它们会得到一个UINT_MAX的保留计数。用%d打印的UINT_MAX将导致-1。使用%u表示无符号整数。

我想编译器很聪明,可以从给定代码中创建字符串文字。由于它们驻留在自己的内存空间中,并且从未释放,因此它们会得到一个UINT_MAX的保留计数。用%d打印的UINT_MAX将导致-1。使用%u表示无符号整数。

我想编译器很聪明,可以从给定代码中创建字符串文字。由于它们驻留在自己的内存空间中,并且从未释放,因此它们会得到一个UINT_MAX的保留计数。用%d打印的UINT_MAX将导致-1。将%u用于无符号整数。

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

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

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

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

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

- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;
您应该使用
%u
在32位体系结构上显示它,使用
%lu
在64位上显示它。 但是您不应该直接使用retainCount,在代码中使用它意味着您有架构问题,objective-c(ARC或手动引用计数)提供了一套完整的机制来管理内存和ob