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];
    }
}
这次是