Obj-C Accessors и ARC - PullRequest
       24

Obj-C Accessors и ARC

0 голосов
/ 12 марта 2012

Я написал очень базовый класс, чтобы поиграть с новыми методами ARC и accessor, просто чтобы понять, как они работают.Из того, что я прочитал, 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 голосов
/ 12 марта 2012

rcplusplus,

Вы спросили:

Кажется, что aString указывает на строковую переменную-член, что означает, что когда я изменяю aString, я также изменяю строку с ним. Я попытался освободить aString из метода main (), но затем я получил ошибку компилятора. Как это исправить? Я использую метод копирования, или есть другой способ?

Чтобы освободить любой предмет ARC, нужно установить его на nil. Это говорит компилятору, что вы закончили с этим элементом. Выпускается в присвоении.

Пример:

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

или из вашего класса:

string = nil;

Andrew

...