2012-04-24 2 views
1

первое сообщение. Извините, если я испортил правила кода. Я пытаюсь изучить Objective C из руководства Big Nerd Ranch. Я опубликую пример, посвященный сильным ссылкам.Новое в Цель C: Нужна помощь в понимании сильной ссылки и назначении

#import <Foundation/Foundation.h> 

@interface Asset : NSObject 
{ 
    NSSTRING *label; 
    unsigned int resaleValue; 
} 
@property (strong) NSString *label; 
@property unsigned int resaleValue; 
@end 

Так что в основном NSString нуждается в сильной ссылке, в то время как int нет. Я знаю, что NSString - это объект, и я читал, что если ничего не указано, переменной присваивается свойство assign.

Так что, если назначение достаточно хорошее, чтобы сохранить что-то вроде int от освобождения до тех пор, пока объект, владеющий им, не будет освобожден, почему это недостаточно для того, чтобы объект NSString в объекте Asset освобождался? В конечном счете, я думаю, что я все еще смущен тем, что назначает в отношении ссылок на подсчеты против того, что сильно (или, может быть, я должен сказать, сохранить, поскольку это то, что сильно заменилось в ARC).

ответ

1

сильные == к StD :: shared_ptr, если вы приехали из C++

сильных государств, что объект должен быть сохранен и выпущен соответственно во время назначения.

-(void)assign:(id) b to:(id) a { 
    if(b){ 
     [b retain]; 
    } 
    if (a){ 
     [a release]; 
    } 
    a = b; 

} 

Чтобы ответить на ваш второй вопрос, размер объекта объектива-С не определен как структура. Таким образом, классы obj-C не могут быть сохранены по значению.

Таким образом, все данные внутри класса obj-c, скомпилированные как obj-c, всегда будут иметь старые старые типы данных, хранящиеся в нем, поскольку их размер может быть определен как фиксированный.

Рассмотрите буфер объемом 8 байт;

Первые 4 байта для вашего второго байта - это ваш указатель, так как строка переменной длины изменит размер объекта во время выполнения, вы увидите, как это не будет работать, строка выделяется на кучу и назначен вашему указателю.

+0

Спасибо, я на самом деле участвую в учебе на С ++ прямо сейчас, так что это все еще нова и нечеткая для меня, но я постепенно понимаю ее больше. – Jordy