Obj-C访问器和ARC

时间:2012-03-12 05:04:29

标签: objective-c automatic-ref-counting accessor

我写了一个非常基础类来使用新的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方法,还是有其他方式?

1 个答案:

答案 0 :(得分:0)

rcplusplus,

你问:

  

似乎aString指向字符串成员变量,这意味着当我更改aString时,我也会更改字符串。我尝试从main()方法释放aString,但后来我遇到编译器错误。我该如何解决?我是否使用复制方法,还是有其他方式?

释放任何ARC项目的方法是将其设置为nil。这告诉编译器你完成了这个项目。它在作业中发布。

示例:

[myContainer setString: nil];
myContainer.string = nil;

或者,从班级内部开始:

string = nil;

安德鲁