我写了一个非常基础类来使用新的ARC和访问器方法,只是为了了解它们的工作原理。从我读过的,ARC应该取代手动引用计数,对吧?但是我的访问器方法存在问题。
这是我的Container
课程的界面/实现:
// interface
@interface Container : NSObject {
NSMutableString *string;
}
- (NSMutableString *)string;
- (void)setString:(NSMutableString *)aString;
@end
// implementation
@implementation Container
- (NSMutableString *)string
{
return string;
}
- (void)setString:(NSMutableString *)aString
{
string = aString;
}
- (NSString *)description
{
return [NSString stringWithFormat:@"inner string = %@", string];
}
@end
对我来说似乎没问题,所有参考计数细节都由我认为的ARC处理。问题出现在主方法中:
Container *myContainer = [[Container alloc] init];
NSMutableString *aString = [NSMutableString stringWithString:@"Hello!"];
[myContainer setString:aString];
NSLog(@"%@", myContainer);
[aString setString:@"Bye!"];
NSLog(@"%@", myContainer);
aString = [myContainer string];
[aString setString:@"Bye, again!"];
NSLog(@"%@", myContainer);
似乎aString
指向string
成员变量,这意味着当我更改aString
时,我也会更改string
。我尝试从aString
方法释放main()
,但后来我遇到编译器错误。我该如何解决?我使用copy
方法,还是有其他方式?
答案 0 :(得分:0)
rcplusplus,
你问:
似乎aString指向字符串成员变量,这意味着当我更改aString时,我也会更改字符串。我尝试从main()方法释放aString,但后来我遇到编译器错误。我该如何解决?我是否使用复制方法,还是有其他方式?
释放任何ARC项目的方法是将其设置为nil
。这告诉编译器你完成了这个项目。它在作业中发布。
示例:
[myContainer setString: nil];
myContainer.string = nil;
或者,从班级内部开始:
string = nil;
安德鲁