@interface 、 @implementation
- OC中的類必須包括兩部分土辩,interface部分和implementation部分支救,這才是oc中的一個類的完整聲明;
- OC中將成員變量和成員方法的聲明部分放置在interface部分中拷淘,包括繼承關系各墨,protocal實現(xiàn)關系,都在interface里面的頭部進行聲明辕棚。
- 然后將實現(xiàn)部分放置在implementation部分中欲主,相當于是將類拆分成聲明和實現(xiàn)兩部分,這兩部分缺一不可逝嚎。
@property 和@synthesize
- @property 關鍵字可以自動生成某個成員變量的setter和getter方法的聲明
@property int age;
編譯時遇到這一行,則自動擴展成下面兩句:
-(void)setAge:(int)age;
-(int)age; - @synthesize關鍵字
@synthesize關鍵字幫助生成成員變量的setter和getter方法的實現(xiàn)详恼。
語法:@synthesize age=_age;
相當于下面的代碼:
-(void)setAge:(int)age
{
_age=age;
}
-(int)age
{
Return _age;
}
Category分類 和 類的延展Extension
category:類別是一種為現(xiàn)有的類添加新方法的方式补君。
- 創(chuàng)建方式如下:
-
生成如下:
- 在@interface中添加類的方法,但是不能添加成員變量或?qū)傩悦粱ァ5@種說話不嚴謹挽铁。
- 我們知道在一個類中用@property聲明屬性,編譯器會自動幫我們生成成員變量和setter/getter敞掘,但分類的指針結(jié)構體中叽掘,根本沒有屬性列表。所以在分類中用@property聲明屬性玖雁,既無法生成_成員變量也無法生成setter/getter更扁。
- OC是動態(tài)語言,方法真正的實現(xiàn)是通過runtime完成的,雖然系統(tǒng)不給我們生成setter/getter浓镜,但我們可以通過runtime手動添加setter/getter方法溃列。
#import "MBProgressHUD.h"
@interface MBProgressHUD (kekeke)
//方法
+ (void)showSuccess:(NSString *)success;
//屬性
@property(nonatomic,copy) NSString *nameWithSetterGetter;
@end
#import "MBProgressHUD+kekeke.h"
@implementation MBProgressHUD (kekeke)
//實現(xiàn)的類方法
+ (void)showSuccess:(NSString *)success {
}
//通過runtime手動添加setter/getter方法。
- (void)setNameWithSetterGetter:(NSString *)nameWithSetterGetter {
objc_setAssociatedObject(self, &nameWithSetterGetterKey, nameWithSetterGetter, OBJC_ASSOCIATION_COPY);
}
- (NSString *)nameWithSetterGetter {
return objc_getAssociatedObject(self, &nameWithSetterGetterKey);
}
@end
Extension : 首先還是需要創(chuàng)建相關類的擴展膛薛,即方法的聲明听隐,然后在需要擴張的類中引入頭文件,然后實現(xiàn)聲明的方法哄啄。
- 使用類似 分類的方式定義頭文件雅任,但是沒有實現(xiàn)類,而是寫在原始實現(xiàn)類.m中
PersonExtend.h
#import "Person.h"
@interface Person () //() 一般不指定名字
- (void) smile; //聲明
@end
2.在Person.m 引入PersonExtend.h 咨跌,并實現(xiàn)方法沪么, 方法即為私有的。
Person.m
#import "Person.h"
#import "PersonExtend.h"
@interface Person (extension) //這里的@interface ... @end 可省略虑润,但不建議成玫。方便看出哪些是私有的方法
- (void) smile; //聲明
@end
@implementation Person
- void smile
{
//在其他公有方法中,使用 [self smile] 調(diào)用
}
@end
Category 與Extension 的區(qū)別
- 形式上看:extension 是匿名的category
- extension中聲明的方法需要在mainimplementation中實現(xiàn)拳喻,而category 不做強制要求
- extension 可以添加屬性哭当、成員變量,而category 一般不可以冗澈。