Как освободить атрибут протокола?
-
05-07-2019 - |
Вопрос
Некоторое время я работаю над разработкой 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> делегат