OC學習 11 型別比較

2021-07-09 04:47:46 字數 4144 閱讀 4783

*****=文件更新狀態*****

2015-12-27:發布

day11-[2015-12-24]

一、不同型別資料的比較

1.基本型別直接使用==

2.結構體逐一比較每個成員,或者利用位元組對齊特性進行逐字節比較

3.oc物件,==比較的是位址,如果需要比較內容(屬性、成員變數等),則需要重寫isequal:方法

a。原則:非nil、自反、對稱、一致、傳遞

b。注意繼承時的特殊性:在做型別判斷時,不應該使用iskindofclass:而是使用ismemberofclass:

4.特殊型別的比較

a。字串:應該使用isequal:或isequaltostring:;而不應該使用==

b。包裝類:nsnumber可以直接==比較

// 結構體的逐字節比較

// main.m

#import

/** * 乙個通用的結構體變數比較函式

* 前提:2個比較的結構體是相同型別

* 原理:利用結構體的位元組對齊特性,進行逐字節比較

* * @param p1 第乙個結構體變數的首位址

* @param p2 第二個結構體變數的首位址

* @param len 結構體型別所佔儲存位元組數

* * @return no:不相等;yes:相等

*/bool isequalstruct(const

void* p1,const

void* p2,size_t len)

}return

yes;

}typedef

struct demo;

int main_struct(int argc, const

char * argv) ;

nssize pb=;

nslog(@"%d",isequalstruct(&pa, &pb, sizeof(nspoint)));

demo d1=;

demo d2=;

nslog(@"%d",isequalstruct(&d1, &d2, sizeof(demo)));

return0;}

// 物件重寫equal比較

// yybook.h

#import

@inte***ce

yybook : nsobject

@property (nonatomic,copy)nsstring* title;

@property (nonatomic,assign)int price;

-(instancetype)initwithtitle:(nsstring*)title price:(int)price;

+(instancetype)bookwithtitle:(nsstring*)title price:(int)price;

@end

// yybook.m

#import "yybook.h"

@implementation

yybook

-(instancetype)initwithtitle:(nsstring *)title price:(int)price

return

self;

}+(instancetype)bookwithtitle:(nsstring *)title price:(int)price

-(bool)isequal:(id)object

//自反性

if (self==object)

//一致性:使用ismemberofclass:代替iskindofclass

if (![object ismemberofclass:[self class]])

//逐一比較每個成員變數或屬性

return [self

.title isequal:[object title]] && self

.price==[object price];

}@end

// test_book.m

#import "yybook.h"

int main_book()

if ([b1 isequal:b2])

nslog(@"b1==nil:%d",[b1 isequal:nil]);//0

nslog(@"b1==b1:%d",[b1 isequal:b1]);//1

nslog(@"b2==b1:%d",[b2 isequal:b1]);//1

nslog(@"***************");

yybook* b3=b1;

if (b1==b3)

if ([b1 isequal:b2])

nslog(@"b1==b3:%d",[b1 isequal:b3]);//1

return0;}

1.不同型別資料的比較

 對於簡單型別,可以使用運算子==進行比較

 對於結構體,應該逐一比較其中的每個成員

 但是對於物件型別,則應該使用isequal方法進行比較,且自定義型別需重寫

 注意包裝類、字串等型別的特殊性

2.包裝類/字串的特殊性

 nsvalue不應該使用==運算子

 nsnumber可以使用==運算子

 nsstring視情況而定:採用相同方式建立的nsstring物件可以使用==運算子;反之則不可以

 總之,系統提供的物件型別使用isequal一定比==運算子正確

二、kvc

1.使用鍵值編碼(key value coding)的方式操縱物件的屬性、成員變數

2.基本語法,賦值:setvalue: forkey:

取值:valueforkey:

3.執行機制(以賦值為例,取值過程一樣,只是呼叫的方法不同):

a。首先查詢並執行與key對應的屬性的set***:

b。如果a找不到,找屬性對應的成員變數(以下劃線開頭的),而且不管其訪問許可權

c。如果b找不到,找屬性對應的不帶下劃線的成員變數,而且不管其訪問許可權

d。如果c找不到,呼叫setvalue:forundefinedkey:方法,該方法預設丟擲異常;如果不想丟擲異常,則可以重寫方法

4.在給基本型別的屬性賦值時,必須封裝成oc物件;取值時得到的也是oc物件,可以通過拆包獲取基本型別。

5.在給基本型別的屬性賦值時,不允許賦nil,否則會呼叫setnilvalueforkey:方法,預設丟擲異常;如果不想丟擲異常,可以重寫該方法

//  yyperson.h

#import

@inte***ce

yyperson : nsobject

@property (nonatomic,copy)nsstring* name;

@property (nonatomic,assign,setter=aaa:)int age;

-(void)printheight;

@end

// yyperson.m

#import "yyperson.h"

@implementation

yyperson

-(nsstring *)description

-(void)printheight

//-(void)setage:(int)age

-(void)setvalue:(id)value forundefinedkey:(nsstring *)key

-(id)valueforundefinedkey:(nsstring *)key

-(void)setnilvalueforkey:(nsstring *)key

}@end

// test_kvc1.m

#import "yyperson.h"

int main_kvc1()

// test_kvc2.m

// 在給基本型別的屬性賦值時,不允許賦nil,否則會呼叫setnilvalueforkey:方法

// ,預設丟擲異常;如果不想丟擲異常,可以重寫該方法

#import "yyperson.h"

int main()

**********===eof**********===

c 11 型別推斷

當編譯器能夠在乙個變數的宣告時候就推斷出它的型別,那麼你就能夠用auto關鍵字來作為他們的型別 cpp view plain copy auto x 1 編譯器當然知道x是integer型別的。所以你就不用int了。接觸過泛型程式設計或者api程式設計的人大概可以猜出自動型別推斷是做什麼用的了 幫你...

c 11 型別推導

auto與decltype都是在編譯時期進行自動型別的推導 auto name value 1.int x 0 2.auto p1 x p1 為 int auto 推導為 int 3.auto p2 x p2 為 int auto 推導為 int 4.auto r1 x r1 為 int auto ...

C 11 型別推導auto

在c 11之前,auto關鍵字用來指定儲存期。在新標準中,它的功能變為型別推斷。auto現在成了乙個型別的佔位符,通知編譯器去根據初始化 推斷所宣告變數的真實型別。使用auto會拖慢c 效率嗎?完全不會,因為在編譯階段編譯器已經幫程式設計師推導好了變數的型別。使用auto會拖累c 編譯效率嗎?完全不...