*****=文件更新狀態*****
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 編譯效率嗎?完全不...