Управление памятью в объективе c / iPhone - PullRequest
0 голосов
/ 15 июля 2011

Я новичок в разработке приложений для iPhone.Я занимался разработкой .NET, C # раньше.У меня есть несколько вопросов по управлению памятью в iPhone и цель c.Я надеюсь, что кто-нибудь сможет решить эти вопросы, которые у меня есть.

Q1), если я назначу переменную, подобную этой, нужно ли мне ее освобождать?*

Здесь я знаю, что line2 должен быть освобожден.Но я должен выпустить line3?Или что будет с line3 после освобождения line2?

Q3) У меня есть переменная, объявленная в файле .h, как

NSString *line5;

Тогда у меня есть

@property (nonatomic,retain) NSString *line5;

что это значит?Должен ли я сделать это, чтобы использовать переменные?Что означает «неатомический» и «сохранить»?

Q4) Что означает @synthesize line5; do

Q5)

-(void) myFunction
{
    NSString *line2 = [[NSString alloc] initWithString:@"Hello"];

    line5 = line2;

    [line2 release]; 
}

Вот что произойдет с строкой 5 после вызова этой функции?Будет ли это существовать?Как сделать значение доступным после вызова функции?

Q6)

-(NSString*) myFunction2
{
    NSString *line2 = [[NSString alloc] initWithString:@"Hello"];


    return line2;
}

как определить функцию, которая возвращает строку и заставляет ее существовать вне функции?

Как мне вызвать эту функцию для получения строкового вывода?

Ответы [ 4 ]

3 голосов
/ 15 июля 2011

Q1) если я присваиваю переменную, подобную этой, нужно ли мне ее освобождать?

NSString *line = @""; // is this a correct way of doing things? 

[line release]; // do i have to release it?

Ответ Нет @ "" - это макрос, который создает авто-релиз NSString

Q2)

NSString *line2 = [[NSString alloc] initWithString:@"Hello"];

NSString *line3 = line2;

[line2 release];

Ответ Вы создаете строку 2 (с init), следовательно, вы должны отпустить ее.Вам не нужно освобождать line3, так как он указывает только на line2, поэтому вы должны перезагружать line2.

Q3) У меня есть переменная, объявленная в файле .h, как

NSString *line5; Тогда у меня есть

@property (nonatomic,retain) NSString *line5; что это значит?Должен ли я сделать это, чтобы использовать переменные?Что означает «неатомический» и «сохранить»?

Ответ Вы можете думать о @property как о поведении своего свойства, чтобы при использовании @synthezie компилятор узналкак интерпретировать геттеры и сеттеры для этого свойства.

Q4) Что означает @synthesize line5;do

Ответ Создает методы получения и установки вашего объявленного свойства на основе параметров, выбранных в @property(option,option...)

Q5)

-(void) myFunction
{
    NSString *line2 = [[NSString alloc] initWithString:@"Hello"];

    line5 = line2;

    [line2 release]; 
}

Вот чтопроизойдет с line5 после вызова этой функции?Будет ли это существовать?Как сделать значение доступным после вызова функции?

Ответ функция создает новую строку 2, затем назначает строку 5 в качестве указателя на строку 2, а затем вы освобождаете строку 2, что является проблемой.b / c line5 теперь ни на что не указывает.Вы должны сохранить строку 5, чтобы иметь возможность указывать на строку 2.

Как мне вызвать эту функцию для получения строкового вывода?

Ответ Вы вызываете эту функцию следующим образом:

[self myFunction2];

Окончательно Вы должны прочитать это управление памятью http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html#//apple_ref/doc/uid/10000011-SW1

0 голосов
/ 15 июля 2011

q1) НЕТ q2) если вы освобождаете строку 2, содержимое в строке 3 также будет освобождено, поскольку вы не выделили его q3) Поскольку вы сохранили строку 5, вам нужно освободить ее, сохранение - это то же самое, что и распределение, как вы думаете, а неатомическое означает, что другие потоки из других методов могут обрабатывать его до тех пор, пока операция над этим значением не будет завершена, то есть если вы сделаете его атомарным, быть синхронизированным означает, что семафор будет работать как ключ, и если другие потоки захотят обновить эту переменную, этот поток должен иметь этот семафор.

синтезировать это то, что вы делаете косвенно Предположим, если вы синтезируете строку 5, это означает, (void) setLine5: (NSString *) line5 { self.line5 = line5}

0 голосов
/ 15 июля 2011

Q1. Нет. Когда вы назначаете NSSting с помощью @ "", это объект автоматического выпуска.

Q2. № line2 указывает на line3. Так что я думаю его уже выпустили. Проверьте, запустив, вы получите ошибку неверного доступа при доступе к освобожденному объекту.

Q3. nonatomic работает с synchronization в темах. retain увеличит количество сохраняемых объектов до 1. Короче говоря, если вы сохраняете какую-либо переменную, вы должны освободить ее самостоятельно.

Q4. @synthesize line5; дает вам метод доступа, написанный автоматически. то есть вам не нужно писать это, но вы получите это. если line5 это NSString var,

- (NSString *) line5 {
.....
return line5;
}

- (void) setLine5:(NSString *) aLine {
self.line5 = aLine;
}

Q5. Это приведет к ошибке доступа. Для краткого ответа, вы можете использовать

line5 = [line2 copy];

Но тогда вы должны выпустить line5 где-нибудь в вашем классе.

Q6.

-(NSString*) myFunction2
{
    NSString *line2 = [NSString stringWithString:@"Hello"];
    return line2;
}

Это вернет автоматически освобожденную строку.

0 голосов
/ 15 июля 2011

простая концепция

если использовать для создания объекта с помощью alloc, copy, retain, то только вы несете ответственность за их освобождение.

так

использовать [освобождение объекта];

иначе не беспокойтесь об этом

больше, в то время как возврат с помощью alloc должен использовать autorelease

- (NSString *) myFunction2 { NSString * line2 = [[NSString alloc] initWithString: @ "Hello"];

return [line2 autorelease]; 

}

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