Я беру ObjC и Какао, которое является также моим первым серьезным набегом в программирование в целом.
Я испытываю затруднения из-за различий между initWith методами, которые называют на экземплярах и методах фабрики, которые называют на классах.
Во-первых, почему их называют методами "фабрики", и существует ли надлежащий термин для того, что я дублировал методами "InitWith"?
Во-вторых, каково функциональное различие? Это - просто последствия управления памятью (что методы фабрики возвращают автовыпущенный объект)?
Например, какова реальная разница между [NSString stringWithString: (NSString*)aString]
и [[NSString alloc] initWithString: (NSString*)aString]
?
Разница между методами описана в политике владения объектами Какао . Вы владеете объектом, возвращенным из -initWithString: и поэтому должны освободить его, но вы не владеете объектом, возвращенным из + stringWithString, и поэтому вам не нужно освобождать его (кроме того, если вы действительно хотите получить право собственности на него, вы должны сохранить его).
Заводские методы вызываются потому, что они возвращают для вас уже созданный объект, обычно с параметрами, которые вы предоставляете, которые используются для настройки объекта, для удобства программиста.
В вашем примере
[[NSString alloc] initwithString: (NSString
*)aString];
Когда вы выполняете выделение, вы помещаете в память место для строки, отсюда и выделение. затем вы указываете ему инициализировать строку, равную aString. (NSString *) - это идентификатор типа объекта, поэтому вы говорите, что aString объявлена как NSString.
Обычно я делаю что-то вроде
NSString * aString = @"String value";
, объявляет, чему равен aString.
Если вы размещаете что-то в памяти для управления этим, вам нужно будет освободить это в нужное время, например, в разделе
-(void) dealloc {}
вашего кода.
Все, что касается NSString, можно объяснить в этой документации от Apple NSString
Основное отличие состоит в том, что
[NSString stringWithString:
(NSString*)aString]
возвращает автоматически освобожденную строку, управление памятью которой вам не нужно, тогда как
[[NSString alloc] initWithString:
(NSString*)aString]
возвращает строку, за освобождение которой вы несете ответственность. По сути, первое - это ярлык для второго, плюс автозапуск.