Objective c Obj-C存取器和ARC

Objective c Obj-C存取器和ARC,objective-c,automatic-ref-counting,accessor,Objective C,Automatic Ref Counting,Accessor,我编写了一个非常基本的类来使用新的ARC和访问器方法,只是为了了解它们是如何工作的。据我所知,ARC应该取代手动参考计数,对吗?但是我的访问器方法有问题 下面是我的容器类的接口/实现: // interface @interface Container : NSObject { NSMutableString *string; } - (NSMutableString *)string; - (void)setString:(NSMutableString *)aString; @en

我编写了一个非常基本的类来使用新的ARC和访问器方法,只是为了了解它们是如何工作的。据我所知,ARC应该取代手动参考计数,对吗?但是我的访问器方法有问题

下面是我的
容器
类的接口/实现:

// 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
。我试图从
main()
方法中释放
aString
,但随后出现编译器错误。我该如何解决这个问题?我是使用
copy
方法,还是有其他方法?

rcplusplus

你问:

似乎aString指向字符串成员变量,这意味着当我更改aString时,我也会使用它更改字符串。我试图从main()方法中释放aString,但随后出现了一个编译器错误。我该如何解决这个问题?我是使用复制方法,还是有其他方法

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

例如:

[myContainer setString: nil];
myContainer.string = nil;
或者,在你的课堂上:

string = nil;

ARC环境下的Andrew

变量将使用
strong
引用创建。如果您需要复制存储在指针中的值(如上所述),那么您必须显式地将属性声明为copy,或者创建一个setter方法来复制存储在变量中的值(一直都是这样,ARC不会/不应该影响它)。因此,我应该这样写:
string=[aString copy]
?这将解决问题,对吗?您不需要在ARC下调用
release/retain/dealloc
,让编译器为您执行。有趣的是
[aString copy]
将返回一个不可变的
NSString
。您可能希望使用
[aString mutableCopy]