Ios Obj-c中iVar和self.iVar的保留计数是多少?
这是我的密码Ios Obj-c中iVar和self.iVar的保留计数是多少?,ios,objective-c,retaincount,Ios,Objective C,Retaincount,这是我的密码 import <Foundation/Foundation.h> @interface SyncObjectInfo : NSObject { NSString *strName; } @property(nonatomic,retain) NSString *strName; -(void)returnRetainCount; @end #import "SyncObjectInfo.h" @implementation SyncObjectInf
import <Foundation/Foundation.h>
@interface SyncObjectInfo : NSObject
{
NSString *strName;
}
@property(nonatomic,retain) NSString *strName;
-(void)returnRetainCount;
@end
#import "SyncObjectInfo.h"
@implementation SyncObjectInfo
@synthesize strName;
-(void)returnRetainCount
{
self.strName=@"name";
strName=@"name";
NSLog(@"Que-1. what is the retainCount of self.strName = ___");
NSLog(@"Que-2. what is the retainCount of strName = ___");
[self.strName retain];
NSLog(@"Que-3. what is the retainCount of self.strName= ___");
}
@end
导入
@接口SyncObjectInfo:NSObject
{
NSString*strName;
}
@属性(非原子,保留)NSString*strName;
-(无效)返回重新计入;
@结束
#导入“SyncObjectInfo.h”
@实现SyncObjectInfo
@合成strName;
-(无效)returnRetainCount
{
self.strName=@“name”;
strName=@“名称”;
NSLog(@“Que-1.self.strName=”的重新计数是多少);
NSLog(@“Que-2.strName=”的重新计数是多少);
[self.strName retain];
NSLog(@“Que-3.self.strName=”的重新计数是多少);
}
@结束
我对保留计数感到困惑,所以
请回答-(void)returnRetainCount
方法中的问题(1,2,3)?请解释一下原因
谢谢你可以通过询问任何客观的C对象来找到答案 例如:“
NSLog(@“strName的保留计数为%d”,[self.strName retainCount]);
”
这种方法被认为是“过时”的,不应在运输中使用,生产代码为b.t.w.您可以通过询问任何目标C对象来找到答案 例如:“
NSLog(@“strName的保留计数为%d”,[self.strName retainCount]);
”
这种方法被认为是“过时”的,不应该在运输中使用,生产代码b.t.w.我刚刚修改了您的示例,在您的
NSLog
语句中添加对retainCount
的调用。应该注意的是,retainCount
不是一种特别有用的方法,通常应该避免使用
有关更多信息,请参阅(不要忘记向下滚动以了解更多详细信息)
不管怎样,这是我跑的。请注意,我将[self.str retain]
更改为[self.strName retain]
:
#import <Foundation/Foundation.h>
@interface SyncObjectInfo : NSObject
{
NSString *strName;
}
@property(nonatomic,retain) NSString *strName;
-(void)returnRetainCount;
@end
@implementation SyncObjectInfo
@synthesize strName;
-(void)returnRetainCount
{
NSLog(@"Que-1. what is the retainCount of self.strName = %lu", [self.strName retainCount]);
NSLog(@"Que-2. what is the retainCount of strName = %lu", [strName retainCount]);
[self.strName retain];
NSLog(@"Que-3. what is the retainCount of self.strName= %lu", [self.strName retainCount]);
}
@end
int main(int argc, char *argv[]) {
@autoreleasepool {
SyncObjectInfo *obj = [SyncObjectInfo new];
[obj returnRetainCount];
}
}
然后,当我重新运行时,我得到以下结果:
Que-1. what is the retainCount of self.strName = 18446744073709551615
Que-2. what is the retainCount of strName = 18446744073709551615
Que-3. what is the retainCount of self.strName= 18446744073709551615
保留计数为18446744073709551615。这是因为NSString
s的处理方式与大多数对象不同。这就是为什么retainCount
不是很有用的原因之一
如果我们将
NSString
更改为NSURL
,如下所示:
@interface SyncObjectInfo : NSObject
{
NSURL *strName;
}
@property(nonatomic,retain) NSURL *strName;
// snip
int main(int argc, char *argv[]) {
@autoreleasepool {
SyncObjectInfo *obj = [SyncObjectInfo new];
obj.strName = [NSURL URLWithString:@"http://stackoverflow.com"];
[obj returnRetainCount];
}
}
然后重新运行我们得到:
Que-1. what is the retainCount of self.strName = 2
Que-2. what is the retainCount of strName = 2
Que-3. what is the retainCount of self.strName= 3
前两种情况是相同的。+URLWithString
返回的对象将被保留,但会自动删除,然后分配给属性并再次保留。在将来的某个时候,自动释放池将被刷新,保留计数将降至1
由于显式调用retain
,我们期望的第三个值增加了1
您从苹果文档中了解到的保留计数应为1(而不是问题1和2中的2)在技术上是不正确的,但在概念上是正确的。该对象已自动释放(实际上承诺该对象将在不久的将来释放) 我们可以通过冲洗池来研究自动释放池的效果。我修改了
main
函数,以便在调用returnRetainCount
之前刷新自动释放池
int main(int argc, char *argv[]) {
@autoreleasepool {
SyncObjectInfo *obj;
@autoreleasepool {
obj = [SyncObjectInfo new];
obj.strName = [NSURL URLWithString:@"http://stackoverflow.com"];
}
[obj returnRetainCount];
}
}
这一次的输出是:
Que-1. what is the retainCount of self.strName = 1
Que-2. what is the retainCount of strName = 1
Que-3. what is the retainCount of self.strName= 2
这是你所期望的。那么发生了什么
当URLWithString
方法创建NSURL
对象时,其保留计数为1。但是,NSURL
类需要放弃对象的所有权。如果在返回对象之前在此对象上调用了release
,则保留计数将达到0,并且对象将在返回之前被解除分配
相反,URLWithString
方法调用对象上的autorelease
。自动释放将对象添加到自动释放池。基本上,NSURL
将所有权传递给自动释放池,并理解自动释放池将在不久的将来的某个时间释放对象(在应用程序中,池作为运行循环的一部分被刷新)
在上面的示例中,
URLWithString
返回的对象的保留计数为1。将其指定给属性将使保留计数增加1(因此现在为2)。然后,我们刷新自动释放池(通过离开@autoreleasepool{}的范围)
块,保留计数下降到1。我刚刚修改了您的示例,在NSLog
语句中添加对retainCount
的调用。应该注意的是,retainCount
不是一个特别有用的方法,通常应该避免
有关更多信息,请参阅(不要忘记向下滚动以了解更多详细信息)
无论如何,这是我运行的。请注意,我将[self.str retain]
更改为[self.strName retain]
:
#import <Foundation/Foundation.h>
@interface SyncObjectInfo : NSObject
{
NSString *strName;
}
@property(nonatomic,retain) NSString *strName;
-(void)returnRetainCount;
@end
@implementation SyncObjectInfo
@synthesize strName;
-(void)returnRetainCount
{
NSLog(@"Que-1. what is the retainCount of self.strName = %lu", [self.strName retainCount]);
NSLog(@"Que-2. what is the retainCount of strName = %lu", [strName retainCount]);
[self.strName retain];
NSLog(@"Que-3. what is the retainCount of self.strName= %lu", [self.strName retainCount]);
}
@end
int main(int argc, char *argv[]) {
@autoreleasepool {
SyncObjectInfo *obj = [SyncObjectInfo new];
[obj returnRetainCount];
}
}
然后,当我重新运行时,我得到以下结果:
Que-1. what is the retainCount of self.strName = 18446744073709551615
Que-2. what is the retainCount of strName = 18446744073709551615
Que-3. what is the retainCount of self.strName= 18446744073709551615
保留计数为18446744073709551615。这是因为NSString
s的处理方式与大多数对象不同。这是retainCount
不太有用的原因之一
如果我们将
NSString
更改为NSURL
,如下所示:
@interface SyncObjectInfo : NSObject
{
NSURL *strName;
}
@property(nonatomic,retain) NSURL *strName;
// snip
int main(int argc, char *argv[]) {
@autoreleasepool {
SyncObjectInfo *obj = [SyncObjectInfo new];
obj.strName = [NSURL URLWithString:@"http://stackoverflow.com"];
[obj returnRetainCount];
}
}
然后重新运行我们得到:
Que-1. what is the retainCount of self.strName = 2
Que-2. what is the retainCount of strName = 2
Que-3. what is the retainCount of self.strName= 3
前两种情况相同。+URLWithString
返回的对象将被保留,但会自动删除,然后分配给属性并再次保留。在将来的某个时候,自动删除池将被刷新,保留计数将降至1
由于显式调用retain
,我们期望的第三个值增加了1
您从Apple文档中了解到的保留计数应为1(而不是问题1和2中的2)在技术上是不正确的,但在概念上是正确的。该对象已自动删除(实际上承诺该对象将在不久的将来发布) 我们可以通过刷新池来调查自动释放池的效果。我修改了
main
函数,在调用returnRetainCount
之前刷新自动释放池
int main(int argc, char *argv[]) {
@autoreleasepool {
SyncObjectInfo *obj;
@autoreleasepool {
obj = [SyncObjectInfo new];
obj.strName = [NSURL URLWithString:@"http://stackoverflow.com"];
}
[obj returnRetainCount];
}
}
这次是