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