Вы спросили:
- При этой настройке данные
strong
, а остальные свойства weak
, существует ли потенциальный риск для этого?
Да, если вы nil
dictionary
, все ваши свойства, вероятно, станут nil
, при условии, что у вас нет других сильных ссылок на них в других местах.
Должен ли я сделать данные иваром и оставить все как есть?
Я бы даже не сделал это иваром (если нет каких-то других требований для сохранения этого, что у вас есть)делится с нами).Это должна быть просто локальная переменная, и сделать ваши свойства copy
(или strong
).
Я бы предложил (а) избавиться от свойства NSDictionary
и (б)делая свойства NSString
равными copy
(или strong
), а не weak
.Кроме того, вместо использования метода setPropertiesWith
, я бы просто определил инициализатор:
// User.h
@interface User : NSObject
@property (copy, nonatomic) NSString *uid;
@property (copy, nonatomic) NSString *firstName;
@property (copy, nonatomic) NSString *lastName;
@property (copy, nonatomic) NSString *dob;
@property (copy, nonatomic) NSString *gender;
@property (copy, nonatomic) NSString *avatarURL;
@property (assign, nonatomic) NSInteger status;
- (instancetype)initWithDictionary:(NSDictionary *)dictionary;
@end
И
// User.m
@implementation User
- (instancetype)initWithDictionary:(NSDictionary *)dictionary {
if ((self = [super init])) {
self.uid = dictionary[@"uid"];
self.firstName = dictionary[@"firstName"];
self.lastName = dictionary[@"lastName"];
self.dob = dictionary[@"dob"];
self.gender = dictionary[@"gender"];
self.status = [dictionary[@"status"] intValue];
self.avatarURL = dictionary[@"avatarURL"];
}
return self;
}
@end
И тогда вызывающая сторона сделает:
User *user = [[User alloc] initWithDictionary:someDictionary];
Есть и другие уточнения, которые вы могли бы здесь рассмотреть (например, readonly
открытый интерфейс, объявление обнуляемости, упрощенные обобщения в словаре и т. Д.), Но приведенное выше, вероятно, является хорошей отправной точкой.
Кстати, если вам интересно, почему я сделал эти copy
вместо strong
, мы просто хотим защитить себя на случай, если вызывающий объект передал NSMutableString
(который является подклассом NSString
) и случайно мутировалэто позже.Это немного более безопасно, немного более защитная схема.