2011-12-19 2 views
1

я сосредоточиться на проект, чтобы добавить поддержку изображения на основе 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 в моем коде?

Спасибо!

ответ

0

CTRunDelegateCreate создать делегат с произвольным указателем контекста (void *). Это означает, что словарь imgAttr не сохраняется делегатом.

Вам необходимо сохранить словарь контекста при создании делегата и освободить его в обратном вызове dealloc.

+0

Но я использовал метод класса NSDictionary, и deallocCallback ничего не сделал. – scorpiozj

+0

Я использую alloc и реализую deallocCallback, и проблема отсутствует. Это меня смущает. Во всяком случае, ты прав! – scorpiozj

Смежные вопросы