簡體   English   中英

了解ObjectC中的類

[英]Understanding Class in ObjectC

在objc.h中,有Class的定義

typedef struct objc_class *Class;

typedef struct objc_object {

  Class isa;
} *id;

案例:在NSObject中使用Class:

/*************** Basic protocols  ***************/

@protocol NSObject

- (BOOL)isEqual:(id)object;
- (NSUInteger)hash;

- (Class)superclass;
- (Class)class;
- (id)self;

很難理解,所以Class只是結構,而不是像NSObject等真實的類。

課堂的真正目的是什么?

我認為您的方法有誤。

頭文件應該看起來像這樣:

#import <Foundation/NSObject.h>

@interface Fraction: NSObject {
    int numerator;
}

-(void) print;
@end

和這樣的實現(.m文件)

#import "Fraction.h"
#import <stdio.h>

@implementation Fraction
-(void) print {
    printf( "%i", numerator );
}
@end

資源

問候

在Objective-C中,類是“ 一流的對象 ”。 它們在運行時類型檢查中至關重要,例如,檢查對象是否為可以使用的字符串

[obj isKindOfClass:[NSString class]];

-isKindOfClass:需要接受一個Objective-C類作為參數, Class是它的表示。

(除非需要在C API級別以下操作Objective-C運行時,否則您幾乎不需要關心objc.h的類型定義。)

類使Objective-C運行時系統知道在哪里查找方法表(以及實例變量等)。 特別是當你寫

[self foo: bar];

運行時系統調用

objc_msgSend(self, @selector(foo:), bar);

然后使用self的類型找到正確的Class,以找到適當的方法表,以找到與foo:消息相對應的實現。 然后運行它。

由於具有Class類,因此可以使用Objective-C運行時的所有動態行為。 它不是您將永遠繼承或實現的類。 運行時會填寫有關您的類的元數據,可以進行內省或修改以訪問該元數據。

諸如C ++甚至Java之類的語言對這種事情的支持非常有限。 在這方面,Objective-C更接近Ruby或Python腳本語言。 實際上,您可以在運行時用自己的實現替換現有類中的實例方法,並以大多數編譯語言無法觸及的其他方式影響類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM