У меня есть несколько классов: Book
, Publisher
,и Genre
.Задача-C: работа со слабыми ссылками [Решено]
Так вот главный класс Book.h:
#import "Publisher.h"
#import "Author.h"
#import "Genre.h"
@interface Book : NSObject
@property (nonatomic, strong) NSString *bookName;
@property (nonatomic, strong) Author *author;
@property (nonatomic, strong) Publisher *publisher;
@property (nonatomic, weak) Genre *genre;
- (instancetype)initWithBookName:(NSString *)name andAuthorName:(NSString *)authorName
andPublisher:(NSString *)publisherName andGenreName:(__strong NSString *)genreName;
- (NSString *)description;
@end
и его реализация Book.m:
#import "Genre.h"
#import "Book.h"
#import <Foundation/Foundation.h>
@implementation Book
- (instancetype)initWithBookName:(NSString *)name andAuthorName:(NSString *)authorName
andPublisher:(NSString *)publisherName andGenreName:(__strong NSString *)genreName{
self = [super init];
if (self) {
_bookName = [name copy];
_author = [[Author alloc] initWithAuthorName:authorName];
_publisher = [[Publisher alloc] initWithPublisherName:publisherName];
_genre = [[Genre alloc] initWithGenreName:genreName];
}
return self;
}
- (instancetype)init {
return [self initWithBookName:@"unnamed" andAuthorName:@"unnamed" andPublisher:@"unnamed" andGenreName:@"unnamed"];
}
- (NSString *)description {
return [NSString stringWithFormat: @"Book: %@, Author: %@, Genre: %@", self.bookName, self.author, self.genre];
}
@end
У меня есть класс делегата - жанр, поэтому, чтобы избежать сильных опорных циклов, Book
Genre
property должно быть слабый.
На данный момент в инициализаторе Book.m:
_genre = [[Genre alloc] initWithGenreName:genreName];
будет ноль, так как экземпляр Genre
будет удален сразу после назначения.
Согласно Dan комментарий, вот мой Genre.h:
#import <Foundation/Foundation.h>
@class Book;
@interface Genre : NSObject
@property (nonatomic, strong) NSString *genreName;
@property (nonatomic, strong) NSArray <Book *> *books;
- (instancetype)initWithGenreName:(NSString *)name andBooks:(NSArray <Book *>*)books;
- (instancetype)initWithGenreName:(NSString *)name;
- (NSString *)description;
@end
Мой вопрос: «Что это лучший способ для хранения жанр объект (genreName -> Жанр Конструктор -> жанр объекта) в слабый жанр свойств и как его сохранить, не используя конструктор для назначения слабому свойству? ".
Спасибо всем, кто обратился за помощью.
РЕШЕНИЕ: В моем случае это была коллекция Жанра, и я беру ссылку на мою слабую собственность на один из объектов из моей коллекции.
Genre * genre1 = [[Genre alloc]initWithGenreName:@"Comedy"];
Genre * genre2 = [[Genre alloc]initWithGenreName:@"Drama"];
Genre * genre3 = [[Genre alloc]initWithGenreName:@"Fantastic"];
Genre * genre4 = [[Genre alloc]initWithGenreName:@"National"];
NSArray <Genre*> *genres = @[genre1, genre2, genre3, genre4];
Book *book1 = [[Book alloc] initWithBookName:@"Book #3!" andAuthorName:@"Grinch Burs" andPublisher:@"Ableton" andGenre:[genres objectAtIndex:0]];
В коде, который вы опубликовали, ничего не говорится о том, что вы должны сделать свойство 'genre' слабым – dan
@dan Я добавил Genre.h, не могли бы вы посмотреть его снова? – Oracle
Самая большая проблема, которую я вижу, состоит в том, что в «Жанре» должна быть коллекция книг внутри него. Я бы сделал «Жанр» более легким. Вы можете иметь массив всех книг и фильтровать их по жанру, когда это необходимо. Не нужно сохранять предварительно отфильтрованные книги. – Sulthan