一、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個類都有1個叫做isa的指針,這個指針指向它的父類,一直指向NSObject
- 在調用方法的時候,先根據對象isa指針找到類,搜索該類中是否有方法或者屬性,如果沒有就根據該類的isa指針尋找它的父類。。。直到NSObject 如果NSObject中沒有就報錯
七、類的本質
類第一次被訪問的時候,類被加載到代碼段存儲
類一旦被加載到代碼段直到程序結束纔回收
任何存儲在內存中的數據都有1個數據類型
類的存儲步驟
- 先在代碼段中創建Class對象(Class是Foundation框架中的1個類,用來存儲類信息)
- 將類的信息存儲在這個Class當中,這個Class對象,至少有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聲明和實現
- 相同類型可批量生成