Objective-C - Лучшая практика для написания простого метода? - PullRequest
3 голосов
/ 16 сентября 2010

В следующей функции, какая из них является лучшей практикой?

  1. Чтобы отправить автоматически освобожденный объект и заставить вызывающего сохранить его?

  2. или отправить выделенный объект и заставить вызывающего освободить его?


- (NSString*) convertDataToString :(NSData*)myData
{
     //just an example, method might not exist
     NSString *str = [[NSString alloc] initWithData:myData];
     return str;
     return [str autoRelease];
}

Ответы [ 6 ]

7 голосов
/ 16 сентября 2010

После комментария @ Чака -convertDataToString не должен возвращать объект, который должен освободить вызывающий объект.Это нарушило бы Три Волшебных Слова .Если в вашем имени нет «copy», «alloc» или «new», нельзя ожидать, что вызывающая сторона освободит объект.Если у вас есть «copy» в вашем имени или вы начинаете с «new» или «alloc», то вызывающий объект должен освободить объект.имена означают вещи.Если вы научитесь именовать, у вас не возникнет никаких проблем.

3 голосов
/ 16 сентября 2010

правила управления памятью говорят, что ваш первый пример - а это прямая цитата - неверен.Это даже не вопрос предпочтения, как показывают некоторые ответы здесь.Вызывающий объект обычно не владеет возвращаемым вами объектом, поэтому он должен быть автоматически освобожден.

Конкретный пример из правил гласит:

Это неправильно.Следуя политике владения, это приведет к утечке памяти.

 – (NSArray *)sprockets {

    NSArray *array = [[NSArray alloc] initWithObjects:mainSprocket,
                               auxiliarySprocket, nil];
    return array;
}

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

2 голосов
/ 16 сентября 2010

Вы хотите вернуть автоматически выпущенный объект большую часть времени .Если имя вашего метода не содержит одно из следующих слов [ alloc , new , copy ], вы должны возвратить автоматически выпущенный объект.

1 голос
/ 16 сентября 2010

Если вы создаете, размещаете или копируете объект, вы несете ответственность за его освобождение. Исходя из этого, вы должны вернуть автоматически выпущенный объект.

0 голосов
/ 16 сентября 2010

Оба являются приемлемыми, но вы должны назвать свой метод соответствующим образом: если вызывающая сторона несет ответственность за его освобождение, вы должны сделать это явным, указав в имени метода «create», «alloc» или «copy», иначеэто не должноПодробнее об этом можно узнать по адресу http://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html%23//apple_ref/doc/uid/20000994-BAJHFBGH

Может быть немного более привычным возвращать объект автоматического выпуска, но оба в порядке.

0 голосов
/ 16 сентября 2010

Я предпочитаю возвращать авто-релиз.Это означает, что вы не охотитесь, пытаясь найти место, где освобождается память.Совместное распределение и освобождение памяти делает вашу жизнь проще.В конце концов, вы кодируете это, зачем усложнять себе.

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