gpt4 book ai didi

objective-c - NSObject init 方法的问题

转载 作者:行者123 更新时间:2023-12-03 16:50:26 24 4
gpt4 key购买 nike

我对标准 NSObject 的 init() 方法有疑问。我编写了一个类(EFAPersistence),它是 NSObject 的子类。 EFAPersistance 有一个名为 efaDatabase 的属性。

EFAPersistence.h

@interface EFAPersistence : NSObject {
FMDatabase * efaDatabase;
}

@property (assign) FMDatabase * efaDatabase;

每次创建 EFAPersistance 实例时,我都想从 AppDelegate 为 efaDatabase 分配一个值。

EFAPersistence.m

@implementation EFAPersistence

@synthesize efaDatabase;

- (id)init {
if (self = [super init]) {
efaDatabase = [[NSApp delegate] efaDatabase];
}
return self;
}

@end

这种分配方式行不通。但如果我将代码放在正常方法中,它就会起作用。所以我确信 efaDatabase 已在我的 AppDelegate 中正确实例化。它只是在我的 init() 方法中不起作用。这就是为什么我感觉 NSApp 没有在 init() 方法中工作。

这就是重要的 AppDelegate 代码的样子。

AppDelegate.h

@interface AppDelegate : NSObject <NSApplicationDelegate> {
FMDatabase * efaDatabase;
}

AppDelegate.m

- (id)init {
if (self = [super init]) {
NSString * databasePath =
[[NSBundle mainBundle] pathForResource:@"efa" ofType:@"sqlite"];

self.efaDatabase = [FMDatabase databaseWithPath:databasePath];

if (![efaDatabase open]) {
NSLog(@"Couldn't open database: %@", databasePath);
// TODO: Create a database here
}
self.db = [[EFAPersistence alloc] init];
}
return self;
}

如您所见,我正在调用 init 方法。我也通过使用 NSLog() 证实了这一点。 init() 被调用。我尝试在 EFAPersistence 中分配的属性也是在调用 init() 之前创建的。

总结一下:

如何在 init() 方法中完成这项工作,这样我就不必在所有 EFAPersistence 方法中编写样板代码?

最佳答案

在我看来,当您第一次尝试创建 EFAPersistance 对象时,您的 AppDelegate 未设置。这是 AppDelegate.m 中的下面一行

self.db = [[EFAPersistence alloc] init];

我想应用程序委托(delegate)是在 init 完成(返回)后设置的。

关于objective-c - NSObject init 方法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1994415/

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