Как на это влияет добавление переменной как свойства? - PullRequest
0 голосов
/ 28 февраля 2012

Какая разница в управлении памятью для определения переменной как свойства?Например:

@interface foo {
  NSString *theStr;
}
@end

@implementation foo
- (void)bar {
  NSLog(theStr);
}
@end

Versus:

@interface foo {
  NSString *theStr;
}
@property(retain) NSString *theStr;
@end

@implementation foo
@synthesize theStr;
- (void)bar {
  NSLog(theStr);
}
@end

Кажется, что первый автоматически освобожден или что-то подобное, в то время как второй сохраняется в течение всей жизни класса.Это тот случай, или в чем разница?

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Я не думаю, что в первом случае показан объект с автоматическим освобождением, все будет зависеть от того, как вы управляли созданием и уничтожением этого конкретного объекта. Например, если вы создаете этот объект, вы вызываете:

//This string will indeed be autoreleased
theStr=[NSString stringWithString:@"Jibber jabber"];

//Or even
theStr=@"Jibber jabber";

Но вы должны взять на себя ответственность за управление памятью, если создаете ее следующим образом:

//Manage my memory
theStr=[[NSString alloc] init];

//You have to release this property on the dealloc method
-(void)dealloc{
    [theStr release];
    [super dealloc];
}

Во втором примере вы создаете метод установки и метод получения для свойства theStr и, добавляя атрибут nonatomic, вы делаете ваше свойство не безопасным для потока, что означает, что поток может начать изменять ваше свойство, пока другой уже редактирует его. А установив атрибут retain для вашего свойства, метод установки будет синтезирован следующим образом:

- (void) setTheStr:(NSString *) newString {
    [newString retain]; 
    [theStr release]; 
    theStr = newSupervisor; 
}

Вы можете узнать больше об этом в одной из моих любимых книг, Learning Objective-C 2.0 в главе 12.

1 голос
/ 28 февраля 2012

Если вы определяете переменную только в интерфейсе, не определяя ее как свойство (как в первом примере), это означает, что вам придется самостоятельно позаботиться обо всем, что связано с управлением памятью.Присвоение чего-либо этой переменной не сохранит ее автоматически и не установит для переменной другое значение, освободившее предыдущее значение.

Определение этого свойства как свойства создает методы getter и setter под капотом.Наиболее важно, если вы используете его с ключевым словом «retain», ваш метод установки сохранит новое значение (и освободит старое, если оно было).

Обратите внимание, что метод установки будет вызываться только в том случае, еслиВы используете точечную запись, например, self.myStr = @"new string", или вызов метода, например, [self setMyStr:@"new string"].Если вы просто вызовете myStr = @"new string", метод установки не будет вызван, и вам нужно самостоятельно освободить старое значение и сохранить новое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...