В настоящее время я использую iOS 5 SDK, пытаясь разработать свое приложение. Я пытаюсь создать свойство NSString, а затем синтезировать его в файле .m (я делал это раньше без проблем). Теперь я столкнулся с этим: «Семантическая проблема: синтезированный метод получения свойства следует соглашению об именовании Какао для возврата« принадлежащих »объектов».
Это мой код: .h
@interface ViewController : UIViewController {
NSString *newTitle;
}
@property (strong, nonatomic) NSString *newTitle;
.m
@synthesize newTitle;
Кто-нибудь знает, как я мог это исправить? Спасибо!!
Ответы:
Я предполагаю, что используемая вами версия компилятора следует правилам управления памятью и для объявленных свойств - более конкретно, для объявленных методов доступа к свойствам:
Свойство с именем
newTitle
, когда синтезируется, дает вызванный метод-newTitle
, следовательно, предупреждение / ошибка.-newTitle
предполагается, что это метод получения дляnewTitle
свойства, однако в соглашениях об именах говорится, что метод, имя которого начинается с,new
возвращает объект, принадлежащий вызывающей стороне, что не относится к методам получения.Вы можете решить это:
Переименование этого имущества:
Сохранение имени свойства и указание имени получателя, которое не начинается с одного из специальных префиксов имени метода:
Сохраняя имя свойства и имя получателя, и сообщая компилятору, что, хотя имя получателя начинается с
new
, оно принадлежит семействуnone
методов, а не семействуnew
методов:Обратите внимание, что хотя это решение позволяет вам сохранять
newTitle
как имя свойства, так и имя получателя, наличие вызываемого метода-newTitle
, который не возвращает объект, принадлежащий вызывающей стороне, может сбивать с толку других людей, читающих ваш код.Для справки, Apple опубликовала примечания к выпуску «Переход к ARC» , в которых говорится:
Они уже были уведомлены о том, что их утверждение не совсем точное: виновником является имя метода получателя, а не имя свойства.
Редактировать 17 января 2015: Я только что заметил недавнюю фиксацию в Clang, которая предлагает описанный выше вариант 3 (с использованием
objc_method_family(none)
), включая исправление, для общего случая, когда имя свойства соответствует одному из префиксов семейства специальных методов. Xcode, вероятно, будет включать это изменение в конце концов.источник
NS_RETURNS_NOT_RETAINED
это то, что вам нужно тоже.Недопустимые имена объектов
Допустимые имена объектов
#arc # auto-synthesized # xcode-4.6.1
** РЕДАКТИРОВАТЬ **
Видимо, вы не можете использовать mutableCopy либо.
источник
Имя участника, начинающееся с нового, вызывает предупреждение. Измените имя на editedTitle, и предупреждение исчезнет. Мне не удалось найти документацию, подтверждающую это, но с помощью тестирования удалось определить, что переменные-члены, начинающиеся с «new», ухудшают компилятор.
источник
ARC не позволяет использовать «New ....» в имени свойства. но вы можете использовать "newTitle", изменив имя получателя.
источник
Не похоже, что Бавариус предлагал то, что вы хотели сделать. Все, что вы хотите сделать, это объявить переменную экземпляра,
NewTitle
а затем синтезировать свойство. Мы привыкли объявлять переменную экземпляра и свойство. Больше не надо.Теперь я считаю, что правильный способ сделать это заключается в следующем:
.час
.m
Переменная экземпляра для свойства
newTitle
синтезируется. Вы не хотите, чтобы ваша переменная экземпляра была такой же, как ваше свойство - слишком легко ошибаться .См. Пример: Объявление свойств и Синтезирование аксессоров
источник
NS_RETURNS_NOT_RETAINED
это то, что вам нужно.В CoreData, если вы используете «new ...» в атрибуте (обычно компилируется), он будет случайным образом зависать с исключением «плохой доступ».
Журнала сбоев не существует, и строка, обозначенная «Все точки исключения», вам не поможет.
источник
Написание сеттера вручную с тем же именем, что и свойство, сняло это предупреждение.
источник
Помимо вопроса о том, что вы должны / не можете использовать «новый» перед своими именами свойств, скажем еще одну вещь: старайтесь избегать «нового» перед именами в целом. «Новое» зависит от времени. В настоящее время это новое для вас, но через некоторое время вы, возможно, захотите снова внедрить что-то новое. Поэтому использование «нового» в именах всегда плохо. Попытайтесь думать так: в мире программирования «новое» всегда создает что-то: новый экземпляр чего-либо.
В вашем случае, когда вы хотите назначить другой заголовок, чем текущее имя вашего свойства titleReplacement.
Еще одна вещь: попробуйте сначала назвать функции и методы с помощью глагола, например, setSomething или getSomething. Но в свойствах попробуйте сначала дать имя объекту, например, heightMinimum, heightMaximum и т. Д. -> когда вы используете инспектор при кодировании, вы всегда ищете объекты. Попробуйте это. ;-)
источник
NS_RETURNS_NOT_RETAINED
используется для решения проблемы именования.Мы можем найти его определение следующим образом:
Приложите больше деталей здесь.
источник
попробуй это:-
источник