gpt4 book ai didi

ios - Objective-C:使用弱引用

转载 作者:行者123 更新时间:2023-12-01 22:29:56 24 4
gpt4 key购买 nike

我有几节课:Book , Publisher , AuthorGenre .

所以这里是主类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

我有委托(delegate)类 - 类型,所以为了避免强引用循环, BookGenre属性一定很弱。

此时在 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

我的问题是“在弱属性流派中存储流派对象(流派名称->流派构造函数->流派对象)的最佳方法是什么,以及如何在不使用构造函数分配给弱属性的情况下存储它?”。

解决方案:在我的情况下,它是类型的集合,我将我的弱属性引用引用到我的集合中的一个对象。
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]];

最佳答案

要记住的规则是 - 强属性会增加引用计数,而弱属性不会 - 当引用计数变为 0 时,会释放适当的属性。因此,在 Genre 的情况下 - 在您的代码中,没有对它的强引用,因此它被解除分配。真正的解决方案是让流派“拥有”另一个类。这个类将管理流派,创建它们并保持对它们的强引用,例如可能在一个流派数组中。您的“强”类型将与初始化程序一起传递,然后弱引用是正确的方法,防止保留循环,但是 Genre 属性已经具有的强属性阻止了 dealloc - 这有意义吗?

在某种程度上,将您的对象视为需要一个“所有者”类是有道理的,其中定义了强引用以使它们保持事件状态。然后,当传递给您的 Book 类等其他类时,它们具有弱引用,这会阻止您所说的保留循环。书类不是所有者,但其他人是 - 所以它不会消​​失。

关于ios - Objective-C:使用弱引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35526594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com