假设我有一个名为 MyTestClass.h 的课程。
有三个NSString变量以不同方式初始化
类结构看起来像
@interface MyTestClass : NSObject {
NSString *testString1;
NSString *testString2;
NSString *testString3;
}
@property (nonatomic, retain) NSString *testString1;
@property (nonatomic, retain) NSString *testString2;
@property (nonatomic, retain) NSString *testString3;
@end
MyTestClass.m
@implementation MyTestClass
@synthesize testString1, testString2, testString3;
-(id) init{
self.testString1 = @"";
[self setTestString2:@""];
testString3 = @"";
}
现在我打算创建一个 MyTestClass
的对象MyTestClass *obj = [[MyTestClass alloc] init];
我认为在此代码行执行 testString1 之后, testString2 和 testString3 retainCounts 将 1
我纠正了我的朋友吗?
我可能知道如果我发布testString3会发生什么?
对此有任何帮助表示赞赏。
由于
答案 0 :(得分:2)
由于您在此示例中使用文字字符串retainCount
并不重要(甚至不是delta),因为这些字符串对象实际上并不会被解除分类。
但是,如果您为每个属性分配运行时分配的字符串,则前两个将保留,第三个不会。由于您的属性被声明为retain并且您在一个中使用点语法而在另一个中使用“setProperty”语法,因此执行相同的setter并保留传递给该setter的对象。第三个例子,您只需将属性的支持ivar设置为右侧的值,而不影响其所有权。
值得注意的是,retainCount
仅作为delta有用,不应被视为明确的数字。你永远不应该明确检查retainCount
的值,因为它的绝对值是不可预测的,没有用。你似乎在你的问题中理解了这一点,但是在处理retainCount以确保所有参与者都能理解它时,值得重申。