Objective c Obj-C存取器和ARC
我编写了一个非常基本的类来使用新的ARC和访问器方法,只是为了了解它们是如何工作的。据我所知,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
容器
类的接口/实现:
// 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]
。