Objective-C 隨手記5

一、Setter和Getter

//聲明
-(void)setName:(NSString *)name;
-(NSString *)getName;
//定義
-(void)setName:(NSString *)name
{
    _name = name;
}
-(NSString *)getName
{
    return _name;
}

//調用
        Person *p1 = [Person new];
        [p1 setName:@"jack"];
        NSLog(@"%@",[p1 getName]);

OC中點語法會直接調用Setter和Getter

p1._name =10等價於調用[p1 set去掉下環線的屬性名首字母大寫:數據]

所以不要在set和get中使用點語法會出現死循環

二、static

  • static不能修飾屬性,也不能修飾方法
  • static可以修飾方法中的局部變量

如果方法中的局部變量被static修飾,那麼這個變量就會被變成靜態變量。存儲在常量區 當方法執行完畢之後 不會回收 下次再執行這個方法的時候,直接使用 而不會再聲明瞭

三、self

可以在對象方法和類方法中使用,self是一個指針,再對象方法中self指向當前對象,再類方法中指向當前類在代碼段當中的位置

四、description方法

存在於NSObject中

可以返回一個NSString 構造一個描述該對象的字符串。當NSLog處理%@說明符時,會詢問參數列表中相應的對象來得到對象的描述,此時就獲得了description中返回的消息。

-(NSString *)description
{
    return (@"hello,im Person");
}
//調用
Person *p1 = [Person new];
NSLog(@"%@",p1);
//2019-10-09 15:42:35.560555+0800 OC3[8741:1265627] hello,im Person

五、@class 類名 

在函數聲明中調用了其他類 使用@class 類名 來高速編譯器這是個類 在需要真正需要用到的地方再import 減輕系統負擔


//People.h
#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
@class Dog;
@interface Person : NSObject
{
    NSString *_name;
    int _age;
}
-(void)sayHi;
-(void)setName:(NSString *)name;
-(NSString *)getName;
-(void)testWith:(Dog *)dog;
+ (void)hehe;
+(Person *)person;
@end

//People.m

#import "Dog.h"

六、子類在內存中的存儲方式

創建一個對象

  1. 子類對象中有自己的屬性和所有父類的屬性
  2. 代碼段中的每1個類都有1個叫做isa的指針,這個指針指向它的父類,一直指向NSObject
  3. 在調用方法的時候,先根據對象isa指針找到類,搜索該類中是否有方法或者屬性,如果沒有就根據該類的isa指針尋找它的父類。。。直到NSObject 如果NSObject中沒有就報錯

七、類的本質 

類第一次被訪問的時候,類被加載到代碼段存儲

類一旦被加載到代碼段直到程序結束纔回收

任何存儲在內存中的數據都有1個數據類型

類的存儲步驟

  1. 先在代碼段中創建Class對象(Class是Foundation框架中的1個類,用來存儲類信息)
  2. 將類的信息存儲在這個Class當中,這個Class對象,至少有3個屬性 : 類名、屬性、方法
  3. 存儲類的類對象也有1個叫做isa的指針,指針指向存儲父類的類對象

八、如何獲得存儲在代碼段中的類對象

  • 調用類的類方法class就可以得到存儲類的類對象的地址 Class c1 = [Person class]
  • 調用對象的對象方法class就可以得到存儲這個對象所屬的類的Class對象的地址
  • 對象中的isa指針的值就是存儲類的類對象的地址
  • 使用類對象可以也只能調用類的類方法

:聲明Class指針的時候不需要加* 因爲在typedef的時候就已經加*了

九、類擴展

不是所有的屬性和方法都需要在類的頭文件中聲明,有的屬性涉及實現細節最好使用類擴展,類擴展是一組私有聲明。

子類無法獲取父類的類擴展

//類擴展
@interface Person ()
@property (nonatomic) unsigned int tall;
@end
//類定義
@implementation Person

十、@property和@synthesize的用法

@property

自動生成getter和setter方法的聲明,寫在@interface類生命之中

//等同於聲明setAge getAge,
@property int age;
//可以直接在定義中定義

注意:

  • @property類型和屬性的類型一致
  • @property名稱與屬性名稱一致(去掉下劃線)

@synthesize

自動生成getter和setter的實現

@synthesize age

會自動生成屬性 將參數自動複製給生成的私有屬性age 

 @synthesize age = _age

不會再自動生成私有屬性 而是直接把參數複製給制定的屬性 _age

可以批量聲明

 @synthesize age = _age,name = _name;

@property增強Xcode4.4後做出了更改

  • 自動生成私有屬性
  • 生成getter setter聲明和實現
  • 相同類型可批量生成

 

 

 

 

 

 

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