OC語法

類的創建

  • 聲明:就是對的概括說明,它是給使用該的人看的
    1. 確定類名
    2. 要繼承NSObject,是爲了讓類有創建對象的能力
    3. 聲明必須以@interface 開頭 以@end結尾
    4. 聲明屬性,必須在@interface 與@end之間的大括號中
    聲明屬性的時候不可以對屬性進行初始化
    5. 聲明方法,必須在{} 與 @end之間進行聲明,不可以有方法的實現
    格式:方法類型標識符 (返回值類型) 方法名:(參數類型) 參數名稱 方法名:(參數類型) 參數名稱

  • 實現:實現聲明所有的方法
    必須寫在@implementation 與@end

    @interface Person : NSObject
    {
        int  _age;
    }
    -(void) fun;
    @end
    @implementatial Person
    -(void) fun {
    }
    @end

對象方法與類方法

對象方法:
1. 聲明和實現方法時候,以 -開頭
2. 對象方法是隸屬於對象,只能通過對象調用
3. 對象方法中可以直接訪問成員變量,因爲對象方法和成員變量都是隸屬於該對象的
4. 對象方法中可以調用其他對象方法
5. 對象方法中也可以調用類方法
類方法:
1. 聲明和實現的標識符都是 +
2. 類方法它是屬於類本身的
類方法優點:
1. 調用類方法不用創建對象,所以節省內存
2. 通過對象調用對象方法,首先要通過對象找他isA指針,然後在去類中找相應的方法,所有比較慢

@interface ZZPerson : NSObject
{
@public
    int _age;
    NSString * _name;
}
- (void) setAge:(int) age;
+ (int) sumOfNum:(int)num andOther:(int) other;
@end

@property屬性聲明

在Xcode4.4之後,對象@property進行了一個增強
1. 直接在類的聲明中可以通過@property生成setter 和 getter 方法的聲明和實現
2. 同時它還好生成一個私有的成員變量 _屬性名稱

在使用@property增強的時候如何自定義setter方法
1. 如果你實現自定義的setter方法,@property就不會幫你生成它的setter方法,但仍然會幫你生成getter方法和私有的成員變量
2. 如果你實現自定義的getter方法,@property就不會幫你生成它的getter方法,但仍然會幫你生成setter方法和私有的成員變量
3. 如果你同時實現自定義的setter 和 getter方法,@property就不會幫你生成它的setter 和 getter方法,同時也不會幫你生成私有成員變量了

@interface ZZPerson : NSObject

//年齡
@property (nonatomic, assign) int age;

//姓名
@property (nonatomic, copy) NSString *name;
@end

id類型

id 類型是一個萬能對象指針類型,它可以指向任意類對象
id 類型本身就是一個指針類型,接收對象時候不要再加 * 了;

id:缺點:
1. 所有它任意對象上的方法它都可以調用,但如果這個對象上不存在這個方法,那再運行時就報錯
2. 它不會進行編譯時的檢查
3. 當是用id類的變量去調用一個方法的時候,它會提示很多類似方法,不容易找到自己對象上的方法

構造方法

構造方法可以用類方法和對象方法構造。

// .h
@interface ZZPerson : NSObject

@property int age;

//instancetype 相對於id類型,它會自動進行類型檢查,如果不一致就會報一個警告
//instancetype 只可以作爲返回類型
//簡便構造方法,都是以類名去掉前綴然後小寫首字母開頭
+ (instancetype) personWithAge:(int) age;
//初始化對象方法
- (instancetype) initWithAge:(int) age;

@end
// .m
@implementation ZZPerson
+ (instancetype) personWithAge:(int) age
{
    return [[self alloc] initWithAge:age];
}
- (instancetype) initWithAge:(int) age
{
    if (self = [super init]) {
        self.age = age;
    }
    return self;
}
@end

重寫init必須要做三件事
1. 必須要調用父類init
2. 必須檢驗父類的init是否成功初始化
3. 返回自己指針

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章