@property @synthesize @ динамическая разница в xcode - PullRequest
2 голосов
/ 26 ноября 2011

Так что я хочу спросить ниже

Вот мой заголовочный файл

NSString *myString;

В м. файл

-(void)someMethod{
    myString = [NSString stringWithString = @"Hello"];
    NSLog(@"%@",myString);
}

-(void)dealloc{
    [myString release];
}
-(void)viewDidUnload{
    [myString release];
    myString=nil;
}

Хорошо, теперь другая ситуация

В моем заголовочном файле

NSString *myString;
@property (nonatomic,retain) NSString *myString;

В м. файл

@synthesize myString;

-(void)someMethod{
    NSString *tempString = [[NSString alloc] initWithString:@"Hello"];
    self.myString = tempString;
    [tempString release];
    NSLog(@"%@",myString);
}

-(void)dealloc{
    [myString release];
}
-(void)viewDidUnload{
    [myString release];
    self.myString=nil;
}

Мне действительно нужно руководство для идиота, потому что я его еще не понимаю. Обе работы. Также я использую релиз в dealloc и viewDidUnload правильно? Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 26 ноября 2011

Информация о свойствах, а не полное руководство:

Одним из преимуществ @property является то, что с @synthesize они создают сеттеры и геттеры, которые обрабатывают удержание и деблокирование (в зависимости от обстоятельств) и работают с илибез ARC (с небольшими изменениями).

свойства больше не нуждаются в объявлении связанных с ними иваров, они будут генерироваться автоматически.

свойства могут быть помещены в файл заголовка (.h) дляПубличное использование или в файле реализации (.m) в расширении класса для частного использования в классе. Операторы

@property и @synthesize не имеют ничего общего с разрешением «точечной нотации».«Точечная нотация» может рассматриваться как замена скобочной формы доступа к сеттерам и геттерам (на самом деле использование более общее, но использование лучше всего ограничено геттерами / сеттерами).

[self myIvar] эквивалентно self.myIvar, а [self setMyIvar:myValue] эквивалентно self.myIvar = myValue.

Точечная нотация может использоваться на не свойствах, таких как NSStrings: myString.length отлично работаети является приемлемо приемлемым.

точечная нотация не имеет ничего общего со свойствами, однако Xcode будет предлагать только автозаполнения для свойств.

0 голосов
/ 26 ноября 2011

@property и @synthesize предоставляют методы getter и setter (accessors), а не вам приходится писать их самостоятельно.Объявление сделано с @property, и оно реализовано с @synthesize.

Таким образом, в основной программе при создании нового объекта класса (при условии, что ваш класс называется MyClass с MyClass.m, MyClass.h), вы можете получить доступ к вашей строковой переменной myString, используяТочечный оператор.Если ваш объект называется NewObject, то вы можете получить доступ к строке внутри основной программы с помощью NewObject.MyString.

Вы также можете использовать это, чтобы установить значение для строки (например, NewObject.MyString = OtherString).Очень удобно и экономит время.Они оба работают, потому что вы обращаетесь к переменным внутри класса, и поэтому вам не нужно устанавливать методы доступа.

Для -(void)dealloc вам также нужно [super dealloc] внутри, чтобы освободить переменныесуперкласс.Вам не нужно выпускать MyString в viewDidUnload, как вы это сделали в методе -(void)dealloc.

Когда вы выделяете память в -(void)viewDidLoad, вам нужно освободить ее в -(void)viewDidUnload, но у вас ее нет, так что она не нужна.

...