Сбой получения/установки категории Objective-C NSString

Я пытаюсь создать категорию NSString, но приложение вылетает при попытке доступа к геттерам/сеттерам.

#import <Foundation/Foundation.h>
#import <AddressBook/AddressBook.h>

@interface NSString (MyCat)

@property (assign, nonatomic) ABRecordRef personRef;

- (void)setPersonRef:(ABRecordRef)personRef;
- (ABRecordRef)personRef;

@end

Кто-нибудь может указать на проблему?


person jkigel    schedule 09.03.2013    source источник
comment
Не благодарите меня за сбой вашего кода, я не был причиной этого.   -  person    schedule 10.03.2013
comment
У вас есть сообщение об ошибке при сбое?   -  person Mike D    schedule 10.03.2013
comment
Нет, просто EXC_BAD_ACCESS   -  person jkigel    schedule 10.03.2013
comment
Вы реализовали геттер и сеттер? Если да, то как? Обратите внимание, что вы не можете добавлять переменные экземпляра в класс в категории.   -  person Martin R    schedule 10.03.2013
comment
Скорее всего проблема в (отсутствии) управления памятью с помощью ABRecordRef.   -  person rmaddy    schedule 10.03.2013
comment
нет необходимости объявлять сеттер/геттер в вашем @interface - это подразумевается наличием @property. Вы должны показать свой код установки/получения.   -  person nielsbot    schedule 10.03.2013
comment
Можете ли вы включить пример использования этого свойства и реализации вашего геттера/сеттера?   -  person Hyperbole    schedule 10.03.2013
comment
Вы должны убедиться, что право собственности на ABRecordRef (которое является CFTypeRef) обрабатывается правильно. В целом, это довольно утомительная задача при работе с категориями, поскольку вам, возможно, придется хранить их, используя связанные объекты (уровень времени выполнения). Если вы сомневаетесь, я бы порекомендовал переосмыслить ваш план переноса данных такого типа с использованием категории в NSString.   -  person Till    schedule 10.03.2013


Ответы (1)


Вы не можете добавлять свойства в класс через категорию. Добавление методов разрешено, поскольку это не увеличивает размер класса. Свойства не просто добавляют методы получения и установки, они также добавляют поле в ваш класс. Лучший способ добавить свойства/поля в существующий класс — создать его подкласс.

person Lance    schedule 09.03.2013
comment
Свойства на самом деле просто обещание предоставить определенные методы доступа. Свойство не обязательно подразумевает наличие переменной экземпляра. Насколько я знаю, вполне возможно добавить свойства в категорию. - person Caleb; 10.03.2013
comment
@Caleb нет, свойства также добавляют хранилище для свойства в класс, иначе где бы автоматически сгенерированный установщик / получатель хранил данные, которые вы настраиваете? - person Lance; 10.03.2013
comment
Калеб, на самом деле, вы правы в некотором смысле, однако в какой-то момент вам нужно настроить резервное поле для свойства. В большинстве случаев компилятор автоматически вызывает для вас @sythesize. Однако в данном случае это не сработает, так как NSString уже скомпилирован в SDK. - person Lance; 10.03.2013
comment
Я только что создал небольшой проект командной строки, чтобы проверить это. Попытка установить свойство, добавленное категорией, приводит к сбою. - person Lance; 10.03.2013
comment
Это потому, что вы не реализовали их в категории (вы, вероятно, не реализовали категорию), а не потому, что вы не можете добавлять свойства в категории. Apple добавила objc_setAssociatedObject() и друзья в iOS 3.1 для поддержки добавления свойств в категории. - person tc.; 10.03.2013
comment
@Lance Подробное обсуждение приведено в Программирование с Цель-C. Это правда, что вы не можете просто добавить объявление свойства и ожидать, что компилятор заполнит пробелы, но из этого не следует, что вы вообще не можете использовать свойства. - person Caleb; 10.03.2013
comment
@ Калеб и т. д., я исправляюсь! Я узнал что-то новое сегодня. Спасибо :) Однако, вероятно, это то, что пытается сделать спрашивающий. просто добавьте свойства. Это все, что мы можем сделать из предоставленного им кода. - person Lance; 10.03.2013