я сосредоточиться на проект, чтобы добавить поддержку изображения на основе RTF OmniGroup в editor.I встретила проблему, когда я использую CTFramesetterCreateWithAttributedString
, и он получаетуправления памятью для iPhone CTRunDelegateRef
EXC_BAD_ACCESS
, который вызванный объектом зомби.
Для простоты я получаю NSAttributedString
из файла rtfd, у которого есть только фотография. Я добавляю метод для анализа тега изображения на iOS на основе образца Omni. И часть для создания NSAttributedString
следуют этой tutorial from raywenderlich, и выглядит следующим образом:
CTRunDelegateCallbacks callbacks;
callbacks.version = kCTRunDelegateCurrentVersion;
callbacks.getAscent = ascentCallback;
callbacks.getDescent = descentCallback;
callbacks.getWidth = widthCallback;
callbacks.dealloc = deallocCallback;
CTRunDelegateRef delegate = CTRunDelegateCreate(&callbacks, imgAttr);
NSDictionary *imgAttr = [NSDictionary dictionaryWithObjectsAndKeys:imgWidth,kImageWidth,imgHeight,kImageHeight, nil];//recored the width and height
NSDictionary *attrDictionaryDelegate = [NSDictionary dictionaryWithObjectsAndKeys:(id)delegate, (NSString*)kCTRunDelegateAttributeName,nil];
[_attributedString appendString:@" " attributes:attrDictionaryDelegate];
CFRelease(delegate);
здесь appendString:attributes:
обеспечивается Omni и категория для NSMutableAttributedString
:
- (void)appendString:(NSString *)string attributes:(NSDictionary *)attributes;
{
NSAttributedString *append;
append = [[NSAttributedString alloc] initWithString:string attributes:attributes];
[self appendAttributedString:append];
[append release];
}
В классе Parser я проверить CTFramesetterCreateWithAttributedString
, и он успешно создается, и проблема с памятью не возникает. Однако, когда я вызываю CTFramesetterCreateWithAttributedString
в моем классе, он принимает проблему EXC_BAD_ACESS
. Я посылаю CTFramesetterCreateWithAttributedString
на мой взгляд, в viewDidLoad:
NSArray *arr = [OUIRTFReader parseRTFString2:rtfString];
self.editFrame.attributedText = [arr objectAtIndex:0];
//for OUIRTFReader
+ (NSArray *)parseRTFString2:(NSString *)rtfString
{
OUIRTFReader *parser = [[self alloc] _initWithRTFString:rtfString];
NSMutableArray *temp = [NSMutableArray arrayWithCapacity:1];
NSAttributedString *tempAstr = [[NSAttributedString alloc] initWithAttributedString:parser.attributedString];
[temp addObject:tempAstr];
[tempAstr release];
if (parser.zjImageArray) {
[temp addObject:parser.zjImageArray];
}
[parser release];
}
здесь editFrame Ивар из OUIEditableFrame
обеспечивается OmniFramework. После этого в layoutSubview:
от OUIEditableFrame
, CTFramesetterCreateWithAttributedString
не удалось. Профилирование с инструментом, он указывает есть объект зомби в:
NSDictionary *imgAttr = [NSDictionary dictionaryWithObjectsAndKeys:imgWidth,kImageWidth,imgHeight,kImageHeight, nil];
Это показывает, что
Объективный-C, сообщение было отправлено на высвобождены объекта (зомби) по адресу
Я не так хорошо знаком с базовым основанием, как UIKit или другие. Поэтому я хотел бы знать, что не так с этим методом, чтобы создать атрибутную строку для изображения с CTRunDelegateRef в моем коде?
Спасибо!
Но я использовал метод класса NSDictionary, и deallocCallback ничего не сделал. – scorpiozj
Я использую alloc и реализую deallocCallback, и проблема отсутствует. Это меня смущает. Во всяком случае, ты прав! – scorpiozj