_myUser = [User alloc]; // I can do this or not do it and it gives me the same result
_myUser = [_model getCurrentUser];
Никогда не называть [SomeClass alloc]
без немедленной отправки результата init
(или их любого изменение) сообщения. Выделенный, но не инициализированный объект опасен; все может случиться, когда вы пытаетесь его использовать.
В этом коде это не имеет никакого значения, потому что вы немедленно замените объект User, который вы только что создали (но не инициализировали), с тем, который вы получили от [_model getCurrentUser]
.
Переменная и объект - это две разные вещи. Переменная является частью любого объекта, который вы объявили в этом свойстве (выглядит как какой-то контроллер вида), и представляет собой контейнер, содержащий ссылку на другой объект, который является объектом User, который вы получаете от модели. Переменная не «потеряет выделение»; пользовательский объект.
Это также объясняет, почему он не имеет смысла говорить что-то вроде:
_myUser = [[User alloc] init]; //This statement is unnecessary!
_myUser = [_model getCurrentUser];
Первая строка создает новый объект пользователя, который не имеет ничего общего ни с чем, и сохраняет ссылку на это в вашей переменной _myUser
, а вторая строка затем сразу заменяет эту ссылку на этот объект ссылкой с другим объектом-пользователем - «текущим пользователем», который вы получаете от модели. Одна переменная, два объекта.
крах простой (lldb)
«(lldb)
» не своего рода аварии; это подсказка отладчика. Вам нужно посмотреть выше подсказки, чтобы узнать, что это за авария.
Он также может помочь просмотреть трассировку стека в навигаторе и точно увидеть, на какой строке вашего кода произошел сбой.
[Добавлено] Или введите bt
в это приглашение, если у вас ничего нет в навигаторе. (По-видимому, LLDB ногами в Xcode без заметив это ошибка, которая начала появляться как в 10.8.4, в соответствии с парой других SO вопросов, которые я видел.)
retain
в конце сделал трюк. ..
Тогда вы не используете ARC. Вы не можете отправлять сообщения retain
в ARC, поэтому, если вы можете отправить сообщение retain
, и ваша сборка будет успешной, это докажет, что вы не используете ARC.
Это, в свою очередь, указывает на то, в чем проблема: вы присвоили этому объекту User, который вы получили от getCurrentUser
, к вашей переменной экземпляра, но поскольку вы не сохранили его или не присвоили ему свойство strong
, оно вымерло из под вами, и с тех пор, как вы все еще держались за него, вы однажды потерпели крах, когда пытались использовать этот мертвый объект.
Я рекомендую включить ARC. Тогда вам не понадобится (или уметь) сохранить объект; просто присваивая ему переменную экземпляра, такую как _myUser
, выполнит задачу сохранения объекта.
Один из вариантов - это решение, которое вы выбрали (retain
). другой должен был бы присвоить объекту свойство myUser
(self.myUser
), а не переменную экземпляра _myUser
. Пока вы не используете ARC, просто присваивание переменной экземпляра не сохраняет объект; присвоение объекту strong
делает, как и retain
.
можете ли вы опубликовать информацию о том, что говорит консоль о сбое? – danh
Вы используете ARC? – Chuck
@CodaFi Я поставил Alloc как способ увидеть, было ли это недостатком, что вызывало его, –