InitWith методы против заводских методов - PullRequest
6 голосов
/ 18 июля 2010

Я забираю ObjC и Cocoa, что также является моим первым серьезным опытом в программировании в целом.

У меня проблемы с различиями между методами initWith, которые вызываются в экземплярах, и методами фабрики, которые вызываются в классах.

Во-первых, почему они называются "фабричными" методами, и есть ли подходящий термин для того, что я назвал методами "InitWith"?

Во-вторых, в чем функциональная разница? Это просто последствия управления памятью (фабричные методы возвращают объект с автоматическим освобождением)?

Например, какова реальная разница между [NSString stringWithString: (NSString*)aString] и [[NSString alloc] initWithString: (NSString*)aString]?

Ответы [ 3 ]

5 голосов
/ 18 июля 2010

Разница между методами описана в политике какао владения объектом .Вы являетесь владельцем объекта, возвращенного из -initWithString: и поэтому должны освободить его, но вам не принадлежит объект, возвращенный из + stringWithString, и поэтому вам не нужно его освобождать (более того, если вы хотите получить право собственности на него, вы должнысохраните его).

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

0 голосов
/ 18 июля 2010

Основное отличие состоит в том, что

 [NSString stringWithString:
  (NSString*)aString] 

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

    [[NSString alloc] initWithString: 
     (NSString*)aString]

возвращает строку, за которую вы отвечаете. По сути, первый - это сокращение для второго, плюс авто-релиз.

0 голосов
/ 18 июля 2010

На вашем примере

 [[NSString alloc] initwithString: (NSString     
*)aString];

Когда вы делаете выделение, вы помещаете в память место для String, а следовательно, выделение.затем вы говорите ему инициализировать строкой, равной aString.(NSString *) является идентификатором для типа объекта, поэтому вы говорите, что aString объявлен как NSString.

Я обычно делаю что-то вроде

   NSString * aString = @"String value";

объявляет, что aString равно.

Если вы распределяете что-то в памяти, чтобы управлять этим, вам нужно будет освободить этов правильное время, например, в разделе

   -(void) dealloc {} 

вашего кода

Все о NSString можно объяснить в этой документации от Apple NSString

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