FMDB 소스 제품군 (1)
필자는 FMDB 원본에 대한 탐구는 먼저 이 세 가지 유형에서 착안했다. FMDatabaseQueue는 FMDatabase를 인용했고 FMDatabase는 FMResultSet을 인용했다.그래서 필자는 FMResultSet->FMDatabase->FMDatabaseQueue와 같은 순서를 통해 이 세 가지를 해석하기로 결정했다.
FMDB에서 사용되는 매크로
원본 코드를 해석하기 전에 FMDB에서 자주 사용하는 매크로를 살펴보자.
#ifndef NS_ASSUME_NONNULL_BEGIN
#define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
#endif
#ifndef NS_ASSUME_NONNULL_END
#define NS_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end")
#endif
_Pragma가 익숙해 보이지 않아요? 코드에 자주 써요.
#pragma mark -
이것은 C++의 잡주 명령입니다. 이 점에 관해서는 여기를 보십시오.이것은 우리가 이렇게 쓰는 것도 효과가 있다는 것을 의미한다
#pragma clang assume_nonnull begin
#pragma clang assume_nonnull end
s.subspec 'standalone' do |ss|
ss.xcconfig = { 'OTHER_CFLAGS' => '$(inherited) -DFMDB_SQLITE_STANDALONE' }
ss.dependency 'sqlite3'
ss.source_files = 'src/fmdb/FM*.{h,m}'
ss.exclude_files = 'src/fmdb.m'
end
현재 FMDB에 설정된 기본 하위 폴더는'standard'입니다. standalone이나standalone-fts가 아닙니다.그래서 이 매크로는 공사에서 모두 NO로 돌아간다.
#if OS_OBJECT_USE_OBJC
#define FMDBDispatchQueueRelease(__v)
#else
#define FMDBDispatchQueueRelease(__v) (dispatch_release(__v));
#endif
OS_OBJECT_USE_OBJC는 과거 iOS 6.0 이하 버전의 GCD에 대해 ARC를 갖추지 못해서 만들어진 것이다.그래서 OS로...OBJECT_USE_OBJC가 0으로 되돌아갈 때 GCD는 dispatch 를 사용해야 합니다.메모리를 풀기 위해 release () 를 사용하십시오.
- (NSData * _Nullable)dataNoCopyForColumnIndex:(int)columnIdx NS_RETURNS_NOT_RETAINED;
- (NSData * _Nullable)dataNoCopyForColumnIndex:(int)columnIdx NS_RETURNS_NOT_RETAINED;
NS_RETURNS_NOT_RETAINED는 이 방법이 되돌아오는 대상이release가 필요하지 않고 NSRETURNS_RETAINED는 메서드가 반환하는 객체가 release가 필요함을 나타냅니다.
마지막으로has_feature 이 방법은 Clang에서 이렇게 설명한HasFeature-Return true if we recognize and implement the feature specified by the identifier as a standard language feature.즉, 만약에 우리가 표지부호가 지정한 기능을 표준 언어 기능으로 식별하고 실현한다면true(Google 번역,doge)로 되돌아간다.Clang에서 아주 많은 키워드를 정의했습니다. 관심 있는 분들은 PPMacro Expansion을 보십시오.cpp, 1094줄부터 시작합니다.
FMDB에 사용된 Sqlite3 오류 코드를 다시 붙여주세요.
#define SQLITE_OK 0 /* | Successful result */
/* */
#define SQLITE_ERROR 1 /* SQL | SQL error or missing database */
#define SQLITE_INTERNAL 2 /* SQLite | Internal logic error in SQLite */
#define SQLITE_PERM 3 /* | Access permission denied */
#define SQLITE_ABORT 4 /* | Callback routine requested an abort */
#define SQLITE_BUSY 5 /* | The database file is locked */
#define SQLITE_LOCKED 6 /* | A table in the database is locked */
#define SQLITE_NOMEM 7 /* malloc() | A malloc() failed */
#define SQLITE_READONLY 8 /* | Attempt to write a readonly database */
#define SQLITE_INTERRUPT 9 /* sqlite3_interupt() | Operation terminated by sqlite3_interrupt() */
#define SQLITE_IOERR 10 /* I/O | Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT 11 /* | The database disk image is malformed */
#define SQLITE_NOTFOUND 12 /* sqlite3_file_control() | Unknown opcode in sqlite3_file_control() */
#define SQLITE_FULL 13 /* | Insertion failed because database is full */
#define SQLITE_CANTOPEN 14 /* | Unable to open the database file */
#define SQLITE_PROTOCOL 15 /* | Database lock protocol error */
#define SQLITE_EMPTY 16 /* | Database is empty */
#define SQLITE_SCHEMA 17 /* | The database schema changed */
#define SQLITE_TOOBIG 18 /* | String or BLOB exceeds size limit */
#define SQLITE_CONSTRAINT 19 /* | Abort due to constraint violation */
#define SQLITE_MISMATCH 20 /* | Data type mismatch */
#define SQLITE_MISUSE 21 /* | Library used incorrectly */
#define SQLITE_NOLFS 22 /* | Uses OS features not supported on host */
#define SQLITE_AUTH 23 /* | Authorization denied */
#define SQLITE_FORMAT 24 /* | Auxiliary database format error */
#define SQLITE_RANGE 25 /* sqlite3_bind() | 2nd parameter to sqlite3_bind out of range */
#define SQLITE_NOTADB 26 /* | File opened that is not a database file */
#define SQLITE_ROW 100 /* sqlite3_step() | sqlite3_step() has another row ready */
#define SQLITE_DONE 101 /* sqlite3_step() | sqlite3_step() has finished executing */
다음 편에서는 FMResultSet의 세계로 들어가 끝까지 살펴보겠습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.