gpt4 book ai didi

objective-c - 将实例变量放在没有 getter 和 setter 的 .h 中有什么用(即没有人可以设置或获取它)?

转载 作者:行者123 更新时间:2023-12-03 17:42:43 25 4
gpt4 key购买 nike

我已阅读 Where to put iVars in "modern" Objective-C?和其他一些问题,但我仍然感到困惑。

我正在阅读 https://www.raywenderlich.com/913/sqlite-tutorial-for-ios-making-our-app SQLite 教程:

。H

#import <Foundation/Foundation.h>
#import <sqlite3.h>

@interface FailedBankDatabase : NSObject {
sqlite3 *_database;
}

+ (FailedBankDatabase*)database;
- (NSArray *)failedBankInfos;

@end

.m
#import "FailedBankDatabase.h"
#import "FailedBankInfo.h"

@implementation FailedBankDatabase

static FailedBankDatabase *_database;

+ (FailedBankDatabase*)database {
if (_database == nil) {
_database = [[FailedBankDatabase alloc] init];
}
return _database;
}

请纠正我错的地方: sqlite3 * database :
  • 不是属性
  • 没有任何合成
  • .m 文件中没有任何 setter 或 getter,因此没有其他类可以访问它——违背了放置在 .h 中的目的文件

  • 这意味着我们无法访问或设置它! 我们为什么要这样做呢?

    把这个放在.h的目的是什么?文件;为什么不只是
    写为属性
    ? 或者写在我们的.m单独存档?

    编辑:
    在 Objective-C 中使用 Sqlite3 的现代方式是什么?

    最佳答案

    并非总是可以在 implementation 中声明实例变量。堵塞。这可能已经有好几年了,但该教程的日期是 2010 年 4 月 8 日。编写它时,作者可能希望它在旧版本的编译器上工作。

    因为_database未声明 @private ,实际上可以访问 FailedBankDatabase 之外的实例变量。执行。在 Objective-C 中,您可以将对象指针视为结构指针,并像访问结构字段一样访问其实例变量。所以你可以这样做:

    #import "FailedBankDatabase.h"

    int main(int argc, char *argv[])
    {
    FailedBankDatabase *db = [FailedBankDatabase database];
    printf("instance variable: %p\n", db->_database);
    return 0;
    }

    不过,这可能是个坏主意。

    更新

    由于您的 sqlite3 *_database旨在私有(private),您可能只想这样做:
    FailedBankDatabase.h
    #import <Foundation/Foundation.h>

    @class FailedBankInfo;

    @interface FailedBankDatabase : NSObject

    + (FailedBankDatabase*)database;
    - (NSArray<FailedBankInfo *> *)failedBankInfos;

    @end
    FailedBankDatabase.m
    #import "FailedBankDatabase.h"
    #import "FailedBankInfo.h"
    #import <sqlite3.h>

    @implementation FailedBankDatabase {
    sqlite3 *_database;
    }

    static FailedBankDatabase *theInstance;

    + (FailedBankDatabase*)database {
    if (theInstance == nil) {
    theInstance = [[FailedBankDatabase alloc] init];
    }
    return theInstance;
    }

    关于objective-c - 将实例变量放在没有 getter 和 setter 的 .h 中有什么用(即没有人可以设置或获取它)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36576705/

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