Вопрос

Некоторое время я работаю над разработкой iPhone.Впервые меня так удивило управление памятью в Objective-C :).но теперь я немного понял.

Вопрос в том, что иногда я использую протокол как атрибут класса, потому что считаю, что его определение очень похоже на определение «интерфейс» в C# или Java.как показано ниже.

@protocol Shield
   ...
@end

// Interface
@interface Dragon {
    id<Shield> shield
    NSString * name;
}

@property (nonatomic,retain) id<Shield> shield;
@property (nonatomic,retain) NSString * name;

@end

но я всегда освобождаю любой объект атрибута в методе Dealloc().как показано ниже.

-(void)dealloc {
   [name release];
   [shield release];  // <--- Totally impossible. xcode said '-release not found in protocol'
   [super dealloc];
 }

Как видите, я не смог опубликовать протокол.Так вызовет ли это у меня проблемы с памятью в будущем?Есть ли у вас другой способ справиться с этим решением, чтобы посоветовать мне?

Это было полезно?

Решение

Вы должны определить свой протокол как соответствующий протоколу NSObject, например:

@protocol Shield <NSObject>
   ...
@end

Это просто, когда ты умеешь! ; -)

Редактировать. Кроме того, вы правы - протоколы в Objective-C эквивалентны интерфейсам в Java и C #.

Еще одно редактирование: вам может показаться странным, что это нужно сделать, но Objective-C допускает наличие нескольких корневых объектов, поэтому вы не можете гарантировать, что каждый объект будет происходить из release. Поскольку <NSObject> - это метод <=>, вы должны определить, что ваш протокол также соответствует протоколу <=>, прежде чем вы сможете быть уверены, что он сможет ответить на метод <=>.

Другие советы

1-правильно вместо [спуска щита] установить

self.shield = nil;

2-Также поменять

@property (nonatomic,retain) id<Shield> shield; 

к

@property (nonatomic,assign) id<Shield> shield;

Тогда с тобой все в порядке.

редактировать:

Причина, по которой вы избегаете удержания делегатов, заключается в том, что вам необходимо избежать петли удержания:

A создает BA, как делегат B ... A выпускается своим владельцем

Если бы B сохранил A, A не был бы выпущен, так как B владеет A, поэтому A Dealloc никогда бы не вызвал, в результате чего A и B протекают как A, так и B.

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

Почему делегатам Objective-C обычно присваивается свойство, а не сохраняется?

см. ссылку на класс uitableview для примера объявления протокола:

@property(nonatomic, Assign) id <UITableViewDelegate> делегат

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top