2015-03-24 2 views
0

Ive пытался покопаться в старых постах, но они были отчасти устаревшими и лет, так что я был обеспокоен вещи, возможно, изменились в связи с ARC вводится и т.д.Когда использовать Alloc

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

Заранее спасибо

ответ

1

Вы используете Alloc всегда, если вы создаете объект по своему усмотрению. Это означает, что при отправке alloc обычно следует метод init.

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

Пример для создания NSArray по своему усмотрению:

[[NSArray alloc]initWithObjects:@"Test", nil]; 

и, как NSArray имеет удобный конструктор здесь пример для этого:

[NSArray arrayWithObjects:@"Test", nil]; 

Если вы используете ARC, не существует никакой разницы , Без ARC объект, возвращенный удобным конструктором, все равно будет автореализован, а выделенный вручную объект должен быть выпущен вами в более поздней точке (или вам нужно добавить авторекламу после инициализации).

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

+0

будет ли он автореализован без дуги, потому что autorelease вызывается в методе arrayWithObjects? – DevilInDisguise

+0

Да, arrayWithObjects возвращает вам автореализованный объект. – Thyraz

+0

sry, u написал, что в вашем ответе, не знаю, что я думал :) Книга, которую я читаю atm, не выпустила никаких объектов, которые были выделены, как ваш первый пример или когда вы делаете [NSString alloc ] initWithString: @ "XXX"]; initWithObjects NSArray также ссылаются на авторекламу в ее реализации? – DevilInDisguise

2

Это 100% зависит от реальных объектов используется из рамок. Действительно отличная новость заключается в том, что Apple чрезвычайно последовательна. Если вы отправляете сообщение, содержащее «Alloc» в нем где угодно, вы несете ответственность за то, чтобы он был выпущен.

Here's a super document on it from Apple.

+0

Я думал, что это было в прошлом, после того, как была представлена ​​ARC. Я больше не полагался на выпуск. Во всяком случае, я не думаю, что это ответ на вопрос, почему кнопки и метки должны быть выделены, в отличие от NSArray, с которыми вы можете работать без проблем, не делая этого. Я буду отмечать ваш ответ, если в ближайшее время не появится ничего более описательного. Thx снова, и хорошая ссылка размещена, ty. – DevilInDisguise

+0

Это не ушло в прошлое, и это объясняет кнопки. Проверьте документ. :) Это все о том, как работает API для конкретного объекта. Если вы вызываете то, что имеет «alloc» в его имени, тогда вы несете ответственность за это. Есть еще несколько других, но я некоторое время был на Земле Свифт, и я забыл о нем. –

1

Если что-то объявлено в .xib, то оно автоматически выделяется для вас. Просто используйте его. Хотя если вы создаете представление в коде u, необходимо сначала его перенести. И если у вас есть свойство NSArray/NSMutableArray и т.д., у может делать одно из следующих действий:

_array = [NSArray new]; 
_array = [[NSArray alloc] init]; 
_array = [NSArray arrayWithObjects: values count:2]; 
_array = @ ["ABC", "xyz"]; 

и т.д., так что вы на самом деле выделения, если вы используете какой-либо из этих методов.

+0

Каждый метод, возвращающий ссылку на объект, может быть распределителем. Посмотрите на '-componentsJoinedByString:' ('NSArray'), например. –

+0

Да. В принципе, моя точка была выделена так или иначе. –

0

Я не очень понимаю, что

они не будут добавлены в виду, когда вы хотите этого.

средства, но вот история:

Каждый объект выделяется с помощью +alloc. Честно говоря, это +allocWithZone:, но это не имеет никакого значения в этом месте.

Самое первое сообщение, которое вы должны отправить вновь созданному экземпляру объекта (помните: вы отправили +alloc объекту класса), является сообщением об инициализации, что-то вроде init…. Для того, чтобы поставить это вместе, вы найдете код, как:

… [[TheClass alloc] init…] …; 

Потому что это скучное типирование есть new распределители. Они поставили это сообщение в одно:

… [TheClass new…] …; 

(Это имеет некоторые преимущества для класса Implementor, тоже, но это прозрачно для вас Думайте об этом, как отправка +alloc, -init….).

В прежние времена это была хорошая идея, чтобы отправить сообщение autorelease к нему в качестве следующего шага по ряду причин:

… [[[TheClass alloc] init…] autorelease] …; 

Это было положить вместе удобство распределителей:

… [TheClass theClass…] … 

Это то, что вы находите большую часть времени при чтении старого кода. Используя ARC, вам больше не нужны удобные распределители: нет авторекламы. Поэтому больше нет причин для удобных распределителей. Но у нас был MRR в течение многих лет, и есть еще много распределителей удобства. (Теперь называются фабричные методы, но CA - это только их подмножество. Подмножество, которое вам не нужно заботиться. Все это с ARC.) Поскольку существует множество CA, они все еще используют их. (И есть проблема с ними. В настоящее время я пишу только распределители new, которые имеют преимущества CA, но не недостаток автореферата.)

Короче говоря: вы просто не видите иногда используется +alloc.