Эта проблема полна во многих местах моего кода, но общее поведение таково:
Существует контроллер вида и контроллер detailview. Я создаю объект пользовательского класса в view.This содержит атрибуты типа указателя, такие как строки. Я использую это для инициализации свойства типа пользовательского класса в подробном представлении с использованием метода setter. Но когда я пытаюсь получить доступ к этим свойствам в подробном представлении, я обнаружил, что атрибуты типа указателя объекта либо отображаются как «вне области видимости», либо их тип был изменен на некоторый произвольный тип. Например, когда я отлаживал последний раз , мои свойства nsstring стали CFSet или что-то в этом роде.
Может ли кто-нибудь из них предложить первопричину этой проблемы?Loose scope свойства типа указателя
ответ
Если они меняются, вы, вероятно, не сохраняете их.
Для строки, ваша собственность должна выглядеть (в файле .h)
@property (nonatomic, copy) NSString *mString;
и установить его как
self.mString = [NSString stringWithFormat:@"hello %@", name];
, который использует свойство сохранять (или в данном случае скопируйте) строку.
Однако, если вы
mString = [NSString stringWithFormat:@"hello %@", name];
вы установили переменную без использования свойства, так что строка не сохраняется - она будет autoreleased в какой-то момент в будущем, и вы будете иметь указатель, который не так указывая на строку больше :)
Зачем использовать копию вместо сохранить для NSStrings?
На самом деле это копия для чего-либо неизменяемого, но имеет изменяемый подкласс (например, NSDictionary, NSArray, NSSet и т. Д.).
Подумайте об этом как о самообороне.
Что произойдет, если у вас есть собственность, как это:
@property (nonatomic, retain) NSArray *things;
и в своем коде вы используете количество вещей в цикле т.е.
uint max = [things count];
for (uint n = 0; n < max; ++n) { ... }
Хорошо, что должно быть в порядке. Пока кто-то не перейдет в NSMutableArray, а не NSArray. Ваш код предполагает, что, поскольку у вас есть NSArray, количество вещей внутри него не изменится.
Если кто-то удалил элемент из вашего NSArray (потому что это действительно NSMutableArray, но вы этого не знаете), в то время как вы были в этом цикле, ваш код умрет ужасно (исключение за пределы).
Какая копия вместо вызова удержания, она вызывает копирование - 100% уверенность, что внутри вашего объекта у вас есть unmutable array вместо измененного объекта, который кто-то еще прошел. Изменчивый массив можно изменить так же сильно, как они хотите - у вас есть своя собственная копия, чтобы код был безопаснее.
Однако это происходит за счет использования памяти - в памяти есть два массива. Обычно стоит взять память на возможный крах imho :)
NB На самом деле, если кто-то просто прошел в обычном NSArray, потому что он неизменен, реализация [NSArray copy]
- это просто сохранение, так что 99/100 раз вы ничего не теряете указав копию для вашего свойства :) - это также верно для всех неизменяемых классов NSxxx.
Я дам вам бонусные баллы, если вы сможете объяснить, почему вы должны использовать копию для NSString (в отличие от сохранения), и когда вы должны использовать удержание вместо копии :) – willcodejavaforfood 2010-11-26 16:03:07
- 1. Loose Scope в угловом JS
- 2. Установка свойства определенного типа указателя
- 3. Добавление $ свойства в Scope
- 4. Несовместимый массив указателя типа указателя
- 5. Жасмин AngularJS: Макет свойства $ scope?
- 6. Получение старого значения свойства scope
- 7. Свойства объекта javascript функции [[scope]]?
- 8. Каковы ограничения Loose XAML?
- 9. Lua and loose Шаблоны
- 10. Loose connection via XSD
- 11. Loose dictionary, need advice
- 12. Распаковка iOS Loose Connection?
- 13. Концептуальный вопрос: Loose Coupling
- 14. «Loose» Bin упаковки Алгоритм
- 15. Compact vs Loose Database
- 16. WPF Loose XAML ResourceDictionary
- 17. Loose Coupling of Components
- 18. Filemaker Loose Query
- 19. возврат из несовместимого типа указателя?
- 20. , когда необходим явный тип указателя типа указателя?
- 21. Ошибка несовместимого типа указателя?
- 22. Постоянное изменение типа указателя
- 23. Пустота преобразование типа указателя
- 24. Литье типа указателя
- 25. типа разницы указателя (минус)
- 26. Предупреждение типа указателя NSString
- 27. Назначение от несовместимого типа указателя с structs
- 28. Тип типа assert nil для типа указателя
- 29. Назначение из несовместимого типа указателя типа
- 30. Wix Burn Loose File Install
поделиться своим кодом для лучшего ответа, подумал, что я могу предложить вам проверить, когда вы устанавливаете эти свойства, правильно ли они установлены, я имею в виду правильный тип. – Sanniv 2010-11-26 13:09:36