国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

IOS學(xué)習(xí)記錄-Objective-c類和協(xié)議

2019-11-14 19:45:28
字體:
供稿:網(wǎng)友

  目前移動開發(fā)熱火朝天,今天在家學(xué)習(xí)最近入手的《Objective-c基礎(chǔ)教程》,初步感覺Objective-c與.Net差別很大,為了更好的學(xué)習(xí)理解Objective-c,將以筆記的形式記錄學(xué)習(xí)的知識點,方便查閱。

  在Objective-c中類分為兩部分:聲明和實現(xiàn),下面定義一個Person類,

Person.h:

#import <Foundation/Foundation.h>@interface Person : NSObject{    //實例成員變量聲明@PRivate    NSString *_firstName;    @protected    NSString *_lastName;    @public    NSInteger *_age;}//屬性聲明@property (nonatomic,strong) NSString *firstName;@property (nonatomic,strong) NSString *lastName;@property (nonatomic,assign) NSInteger *age;//實例方法-(id)initWithFirstName:(NSString *)firstName lastName:(NSString *)lastName age:(NSInteger *)age;-(void)printFullName;//類方法+(void)breath;@end

Person.m

#import "Person.h"@implementation Person-(id)initWithFirstName:(NSString *)firstName lastName:(NSString *)lastName age:(NSInteger *)age{    if(self = [super init])    {        self.firstName = firstName;        self.lastName = lastName;        self.age = age;    }    return self;}-(NSString *)description{    return [[NSString alloc]initWithFormat:@" firstName: %@,lastName:%@,age:%zd",self.firstName,self.lastName,self.age];}+(void)breath{    NSLog(@"people breathing");}-(void)printFullName{    NSLog(@"%@",self->_firstName);}@end

通過程序得出結(jié)論如下: 

  1. #import引入頭文件,該命令可以保證頭文件只被包含一次,無論此命令在文件中出現(xiàn)多少次,c語言使用#include命令。

      2. 每個方法前面都有一個"+" 或者 "-"符號,+表示該方法為類方法由類調(diào)用,-表示該方法為實例方法由實例調(diào)用。

  3. self關(guān)鍵字表引用實例對象自身,與.NET中的this關(guān)鍵字功能相似。

  3. NSObject是Objective-c中基類,自定義類建議繼承NSObject,Objective-C不支持多繼承,但是可以通過category(類別) 和 protocol(協(xié)議)實現(xiàn)多繼承的效果 

  4. description方法繼承與NSObject,在Person中被重寫,在Objective-c中如果直接使用實例對象,默認調(diào)用description方法,相當于.NET中的ToString。

  5. 在Objective-c中方法調(diào)用在一對方括號之間,形式如:[ instance method : parameter parameter ......]。

  6. super用于調(diào)用超類中的實現(xiàn)方式,被用于作為調(diào)用目標。

  7. 類的定義使用關(guān)鍵字@interface,實現(xiàn)使用關(guān)鍵詞@implementation,

      8. 屬性的聲明使用關(guān)鍵字@property格式如:@property (attribute1 attribute2) type propertyName;

      9. @private@public、@protect用戶聲明私有、公有、受保護的成員變量,

測試Person類:

    Person *person = [[Person alloc]initWithFirstName:@"first" lastName:@"last" age:25];    NSLog(@"%@",person);    //firstName: first,lastName:last,age:25        [person printFullName];    //irst last        [Person breath];    //people breathing

objective-c中得屬性可以使用如下關(guān)鍵字進行修飾:

  線程安全性:nonatomic, atomic[默認]

  屬性讀寫性:readonly, readwrite[默認]

  其他特性:assign vs retain[strong] vs weak vs unsafe_unretained vs copy

  assign[默認],主要用于非指針類型的屬性成員,基本數(shù)據(jù)類型

  strong 和 retain功能相同,引用計數(shù)+1,主要用于指針類型的屬性成員
    weak: 聲明為weak的指針,指針指向的地址一旦被釋放,這些指針都將被賦值為nil,有效的防止野指針
  unsafe_unretained:聲明為unsafe_unretained的指針,指針指向的地址一旦被釋放,其他指向該地址的指針都將成為野指針。所以程序開發(fā)中盡量少用。
  copy:創(chuàng)建一個副本,引用計數(shù)為1
 
objective-c中協(xié)議是包含一組函數(shù)定義的集合,繼承協(xié)議的類型需要實現(xiàn)協(xié)議中定義的接口,如下已定一個PersonDelegate協(xié)議
@protocol PersonDelegate <NSObject>//必須實現(xiàn)的方法@required-(void)sleep;-(void)eat;//可實現(xiàn),也可不實現(xiàn)的方法@optional-(void)playBasketBall;@end

現(xiàn)在就讓Person繼承PersonDelegate,

Person.h:

#import <Foundation/Foundation.h>@protocol PersonDelegate <NSObject>//必須實現(xiàn)的方法@required-(void)sleep;-(void)eat;//可實現(xiàn),也可不實現(xiàn)的方法@optional-(void)playBasketBall;@end@interface Person : NSObject<PersonDelegate>{    //實例成員變量聲明@private    NSString *_firstName;    @protected    NSString *_lastName;    @public    NSInteger *_age;}//屬性聲明@property (nonatomic,strong) NSString *firstName;@property (nonatomic,strong) NSString *lastName;@property (nonatomic,assign) NSInteger *age;//實例方法-(id)initWithFirstName:(NSString *)firstName lastName:(NSString *)lastName age:(NSInteger *)age;-(void)printFullName;//類方法+(void)breath;//PersonDelegate 方法-(void)sleep;-(void)playBasketBall;

  //未實現(xiàn)eat方法

@end

Person.m:

#import "Person.h"@implementation Person-(id)initWithFirstName:(NSString *)firstName lastName:(NSString *)lastName age:(NSInteger *)age{    if(self = [super init])    {        self.firstName = firstName;        self.lastName = lastName;        self.age = age;    }    return self;}-(NSString *)description{    return [[NSString alloc]initWithFormat:@" firstName: %@,lastName:%@,age:%zd",self.firstName,self.lastName,self.age];}+(void)breath{    NSLog(@"people breathing");}-(void)printFullName{    NSLog(@"%@ %@",self->_firstName,self->_lastName);}//PersonDelegate 方法-(void)sleep{    NSLog(@"Person sleeping...");}-(void)playBasketBall{    NSLog(@"Person Play basketball");}@end

測試代碼:

Person *person = [[Person alloc]initWithFirstName:@"first" lastName:@"last" age:25];    [person sleep];    //Person sleeping...    [person playBasketBall];    //Person play basketball

通過測試總結(jié)如下幾點:

  1. 一個協(xié)議可以實現(xiàn)另一個協(xié)議,如要實現(xiàn)多個協(xié)議,采用逗號隔開:<protocol1,protocol2....>。

  2. @require定義的方法表示必須要求實現(xiàn),@optional定義的方法表示可以不實現(xiàn),但是經(jīng)過測試發(fā)現(xiàn),協(xié)議中得方法在類沒有任何強制要求實現(xiàn)任何方法。

 

以上就是開始學(xué)習(xí)Objective-C的初步理解,如有不正確的地方,請指出。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 托里县| 衡东县| 泰来县| 绥芬河市| 名山县| 石屏县| 芜湖市| 邵阳县| 谢通门县| 黔西县| 澄城县| 东至县| 高青县| 永新县| 封丘县| 兰溪市| 新民市| 杨浦区| 英吉沙县| 区。| 太康县| 积石山| 广南县| 兰考县| 莱阳市| 安义县| 彩票| 剑川县| 革吉县| 石泉县| 祁东县| 临清市| 肥东县| 河东区| 察哈| 平南县| 铜山县| 利辛县| 五华县| 民勤县| 中宁县|