青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

CG@CPPBLOG

/*=========================================*/
隨筆 - 76, 文章 - 39, 評論 - 137, 引用 - 0
數據加載中……

用OBJC編程 6 - Value and Collections

用OBJC編程 6 - Value and Collections

OBJC里可以用基本的C原生類型,也定義了一些擴展的原生類型。
BOOL類型,它的值是YES和NO,YES等于true等于1。NO等于false等于0。
Cocoa定義了特殊的原生類型,如NSInteger和CGFloat。像NSInteger和NSUInteger,依賴于平臺,在32位系統下是32位的,在64位下是64位的。
通過API傳遞時,最佳實踐是使用這些特定平臺的類型。而局部變量如循環計數,使用基本C變量更好。

C結構體可持有原生類型
一些Cocoa API用C結構體持有數值
NSString *mainString = @"This is a long string";
NSRange substringRange = [mainString rangeOfString:@"long"];
NSRange結構體持有location和length,本例中,substringRange為{10,4}。
類似的在Quartz中,基于CGFloat,NSPoint和NSSize(OSX)或者CGPoint和CGSize(IOS)都是C結構體。

用對象來代替原生類型

例如NSString,NSString是不可變的,這意味著你需要一個不同的字符串時,你需要創建一個新的對象。NSMutableString是可變的,是NSString的子類。
NSString *firstString = [[NSString alloc] initWithCString:"Hello World" encoding:NSUTF8StringEncoding];
NSString *secondString = [NSString stringWithCString:"Hello World" encoding:NSUTF8StringEncoding];
NSString *thirdString = @"Hello World";

// ------------
NSString *name = @"John";
name = [name stringByAppendingString:@"ny"]; // returns a new string object

//----------------
NSMutableString *name = [NSMutableString stringWithString:@"John"];
[name appendString:@"ny"]; // same object, but now represents "Johnny"

格式化字符串
NSString *magicString = [NSString stringWithFormat:@"The magic number is %i", magicNumber];

NSNumber可以表示任何基本C標量類型,包括,char, double, float, int, long, short, 以及unsigned類型和BOOL。
NSNumber* magicNumber     = [[NSNumber alloc] initWithInt:42];
NSNumber* unsignedNumber  = [[NSNumber alloc] initWithUnsignedInt:42u];
NSNumber* longNumber      = [[NSNumber alloc] initWithLong:42l];
NSNumber* boolNumber      = [[NSNumber alloc] initWithBOOL:YES];

NSNumber* simpleFloat  = [NSNumber numberWithFloat:3.14f];
NSNumber* betterDouble = [NSNumber numberWithDouble:3.1415926535];

NSNumber* someChar = [NSNumber numberWithChar:'T'];

可以使用字面常量來創建NSNumber實例,這些例子等價于使用NSNumber的工廠方法
NSNumber *magicNumber = @42;
NSNumber *unsignedNumber = @42u;
NSNumber *longNumber = @42l;
NSNumber *boolNumber = @YES;
NSNumber *simpleFloat = @3.14f;
NSNumber *betterDouble = @3.1415926535;
NSNumber *someChar = @'T';

可以使用訪問器獲得標量值
int scalarMagic = [magicNumber intValue];
unsigned int scalarUnsigned = [unsignedNumber unsignedIntValue];
BOOL scalarBool = [boolNumber boolValue];

NSNumber也可以用在NSInteger和NSUInteger上面
NSInteger anInteger = 64;
NSUInteger anUnsignedInteger = 100;

NSNumber *firstInteger = [[NSNumber alloc] initWithInteger:anInteger];
NSNumber *sencondInteger = [NSNumber numberWithUnsignedInteger:anUnsignedIneger];

NSInteger integerCheck = [firstInteger integerValue];
NSUInteger unsignedCheck = [sencondInteger unsignedIntegerValue];

NSNumber實例是不可變的,而且沒有可變版本的子類,如果你需要一個不同的數字,就使用另一個NSNumber實例。NSNumber實際是一個類簇class cluster。

使用NSValue,NSValue是NSNumber的父類,可以用來持有更多的類型,包括指針和結構等。它有非常多的工廠方法。
NSString *mainString = @"This is a long string";
NSRange substringRange = [mainString rangeOfString:@"long"];
NSValue *rangeValue = [NSValue valueWithRange:substringRange];

// ---------
typedef struct{
    
int i;
    
float f;
} MyIntegerFloatStruct;

//======================
stuct MyIntegerFloatStruct aStruct;
aStruct.i = 42;
aStruct.f = 3.14;

NSValue *structValue = [NSValue value:&aStruct withObjCType:@encode(MyIntegerFloatStruct)];

Collections 容器
像NSArray,NSSet和NSDictionary這些容器可以管理一組OBJC 對象實例,如果你要放一個標量進去,需要包裝為NSNumber或者NSValue。這些容器使用強引用持有它們的內容,也就意味著這些對象實例和容器生命周期一樣。
基本的NSArray,NSSet和NSDictionary都是不可變的,它們都有一個可變版本的子類。

NSArray是有序的容器,它的內容不必是同一類對象。它有很多不同的初始化方法和工廠方法,依賴于對象的數目:
+ (id)arrayWithObject:(id)anObject;
+ (id)arrayWithObjects:(id)firstObject, ,,,;
+ (id)initWithObjects: (id)firstObject, ,,,;

可變參數版本的如arrayWithObjects依賴nil終止
NSArray *someArray = [NSArray arrayWithObjects:someObject, someString, someNumber, nil];

如果某個列表中的對象是nil,可能會發生意外的截斷
id firstObject = @"SomeString";
id secondObject = nil;
id thirdObject = @"anotherString";
NSArray *someArray = [NSArray arrayWithObjects:firstObject, secondObject, thirdObject, nil];

使用字面常量
NSArray *someArray = @[firstObject, secondObject, thirdObject];

// 列表里不能有nil,nil是一個非法數值,會導致運行時異常
id firstObject = @"someString";
id secondObject = nil;
NSArray *someArray = @[firstObject, secondObject];
// exception: "attempt to insert nil object"
如果你需要在容器中使用nil,你應該使用NSNull單件。

查詢Array
NSUInteger numberOfItems = [someArray count];
if([someArray containsObject:someString]){
  
//,,,
}
///// -------------
if([someArray count] > 0){ // 訪問無效index將導致運行時異常
    NSLog(@"First item is: %@", [someArray objectAtIndex:0]);
}
//// ------ 可以使用下標語法
if([someArray count] > 0){
    NSLog(@"First item is: %@", someArray[0]);
}

Array排序
因為NSArray是不可變的,像排序這樣的方法會產生一個新的array
NSArray *unsortedStrings = @[@"gammaString"@"alphaString"@"betaString"];
NSArray *sortedStrings = [unsortedStrings sortedArrayUsingSelector:@Selector(compare:)];

可變版本
NSMutableArray *mutableArray = [NSMutableArray array];
[mutableArray addObject:@"gamma"];
[mutableArray addObject:@"alpha"];
[mutableArray addObject:@"beta"];

[mutableArray replaceObjectAtIndex:0 withObject:@"epsilon"];

[mutableArray sortUsingSelector:@selector(caseInseneitiveCompare:)];

NSSet是一個無序的容器,同樣是不可變的,也有可變版本。初始化同樣是nil結尾。Set只為一個對象存儲一個引用,哪怕你多次加入一個對象
NSNumber *number = @42;
NSSet *numberSet = [NSSet setWithObjects:number, number, number, nil];
// numberSet里僅僅有一個對象

字典是一個key-value容器,注意需要一個對象作為key,這個key對象需要依從NSCopying協議

創建字典,
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
          someObject, @"anObject",
    
@"Hello, World1"@"helloString",
                 @42@"magicNumber",
           someValue, @"aValue",
                     nil];

使用字面常量
// 注意和上面是反的
NSDictionary 
*dictionary = @{
          @"anObject", someObject,
       @"helloString", @"Hello, World1",
       @"magicNumber", @42,
            @"aValue", someValue,,
                     }; // 沒有nil

查詢字典
NSNumber *storedNumber = [dictionary objectForKey:@"magicNumber"];
// or
NSNumber *storedNumber = dictionary[@"magicNumber"];

用NSNull代替nil,NSNull是一個單件,可以用等號來判斷
NSArray *array = @[@"string", @42, [NSNull null] ];

for(id object in array){
    
if(object == [NSNull null]){
        NSLog(@"Found a null object");
   }
}

使用容器保存你的對象。NSArray和NSdictionary可以很容易把內容寫入磁盤。如果它包含的內容是一個property list對象(NSArray,NSDictionary, NSString,NSData,NSDate和NSNumber ), 則可以從磁盤中重新創建。
NSURL *fileURL = //,,,
NSArray *array = @[@"first"@"second"@"third"];

BOOL success = [array writeToURL:fileURL atomically:YES];
if(!success){
    
// an error occured ,,,
}

//,,,,,,,,,,,,,,
NSURL *fileURL = //,,,
NSArray *array = [NSArray arrayWithContentsOfURL:fileURL];
if(!array){
    
// an error occured ,,,
}
如果是其它對象,你需要一個歸檔對象,諸如NSKeyedArchiver,去創建一個容器的歸檔。創建歸檔僅僅需要每一個對象實現NSCoding協議,這意味著每一個對象能夠知道如何在一個歸檔文件里編碼自己(通過實現encodeWithCoder方法)以及如何解碼(實現initWithCoder方法)。

NSArray, NSSet, and NSDictionary 以及它們的可變版本都支持NSCoding,這意味著你可以歸檔一個復雜的對象關系。Interface Builder就是這么做的。

快速枚舉,包括NSArray,NSSet,NSDictionary這樣支持NSFastEnumeration協議的容器都支持OBJC語言級別的快速枚舉
for(id eachObject in array){
  NSLog(@"Object: %@", eachObject);
}

for(NSString *eachKey in dictionary){
  id object = dictionary[eachKey];
  NSLog(@"Object: %@ for key: %@"object, eachKey);
}

對于有序容器,你需要自己保存索引。不能在快速枚舉里改變容器,即使容器是可變的,否則將得到一個運行時異常。
int index = 0;
for(id eachObject in array){
  NSLog(@"Object at index %i is: %@", index, eachObject);
  index++;
}

枚舉對象,使用NSEnumerator對象
for(id eachObject in [array reverseObjectEnumerator]){ // 反序枚舉
 
//,,,
}

id eachObject;
while( (eachObject = [enumerator nextObject]) ) { // 中止時,nextObject返回nil
    NSLog(@"Current object is: %@", eachObject);
}
// 在條件語句里使用=號,會產生一個編譯時警告,因此使用了雙括號來消除這個警告











posted on 2013-11-21 17:34 cuigang 閱讀(369) 評論(0)  編輯 收藏 引用 所屬分類: OBJC

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            黄色国产精品一区二区三区| 午夜精品在线观看| 亚洲婷婷国产精品电影人久久| 激情av一区| 在线视频观看日韩| 亚洲国产天堂久久综合网| 亚洲国产日韩美| 99re6热在线精品视频播放速度| 亚洲伦理一区| 亚洲欧美日韩久久精品 | 欧美一级一区| 欧美在线视频免费| 女生裸体视频一区二区三区| 欧美激情亚洲国产| 99在线|亚洲一区二区| 一区二区三区回区在观看免费视频| 亚洲天堂第二页| 久久久久久久高潮| 欧美日韩国产小视频在线观看| 亚洲视频导航| 久久精品人人做人人爽| 牛牛精品成人免费视频| 99re亚洲国产精品| 久久精品视频免费| 欧美日韩一区二区三区四区五区| 国产精品视频免费| 亚洲精品久久| 老司机成人网| 一区二区三区日韩欧美| 麻豆国产精品一区二区三区| 欧美午夜激情在线| 亚洲欧洲视频在线| 久久久噜噜噜久久久| 亚洲精品日本| 久久在线免费| 韩国女主播一区| 亚洲自拍偷拍色片视频| 欧美jjzz| 久久久久国产精品一区三寸| 欧美日韩一二三四五区| 亚洲国产视频一区| 久久亚洲国产精品日日av夜夜| 一本色道久久88精品综合| 老司机精品导航| 伊人久久久大香线蕉综合直播| 亚洲欧美日韩国产中文在线| 亚洲人屁股眼子交8| 久久精品盗摄| 国产亚洲一二三区| 欧美综合国产精品久久丁香| 99视频精品全部免费在线| 欧美二区在线看| 亚洲福利在线观看| 老司机免费视频一区二区| 欧美一区二区在线| 国外成人网址| 老司机成人在线视频| 久久久久久九九九九| 在线免费观看成人网| 另类亚洲自拍| 裸体素人女欧美日韩| 91久久黄色| 亚洲人成人77777线观看| 欧美大尺度在线观看| 日韩视频在线观看免费| 日韩视频免费观看高清完整版| 欧美精品在线观看91| 亚洲一区二区免费视频| 亚洲午夜高清视频| 国产欧美日韩不卡免费| 久久av免费一区| 欧美一区二区在线视频| 伊人久久亚洲影院| 欧美国产日韩一区| 欧美日韩国产成人精品| 亚洲伊人久久综合| 亚洲欧美成人网| 一区在线观看视频| 在线不卡亚洲| 欧美视频中文字幕在线| 亚洲图片在线| 亚洲午夜精品一区二区三区他趣| 国产精品高潮呻吟久久av无限| 亚洲一区二区影院| 亚洲欧美国产视频| 在线电影一区| 夜色激情一区二区| 国产私拍一区| 欧美黄色免费网站| 欧美性一区二区| 久久综合电影一区| 欧美日韩国产高清视频| 久久av最新网址| 欧美凹凸一区二区三区视频| 日韩香蕉视频| 欧美在线视频在线播放完整版免费观看 | 国产精品一区二区视频| 久久综合一区二区三区| 欧美精品一区二区三区高清aⅴ| 亚洲欧美国产va在线影院| 校园激情久久| 一区二区三区产品免费精品久久75| 中文欧美日韩| 亚洲日韩视频| 久久gogo国模啪啪人体图| 亚洲日本免费| 欧美一区二区三区在线播放| 亚洲精选大片| 久久久91精品国产一区二区三区 | 红桃视频成人| 宅男噜噜噜66一区二区| 亚洲国产精品精华液网站| 亚洲一区二区三区中文字幕在线| 亚洲国产综合在线看不卡| 亚洲欧美视频一区| 亚洲一本大道在线| 欧美电影免费观看高清| 理论片一区二区在线| 国产欧美丝祙| 亚洲在线国产日韩欧美| 一二三四社区欧美黄| 免费成人网www| 老司机aⅴ在线精品导航| 国产日产欧产精品推荐色| 一本在线高清不卡dvd | 久久精品系列| 国产精品久久久久久久久久久久| 91久久精品国产91久久| 136国产福利精品导航| 久久国内精品视频| 久久久精品国产免大香伊| 国产精品久在线观看| 日韩视频在线观看国产| 夜夜嗨av一区二区三区免费区| 蜜桃久久精品乱码一区二区| 老牛影视一区二区三区| 亚洲第一在线综合在线| 久久五月激情| 欧美影院午夜播放| 91久久久久久久久久久久久| 欧美专区在线| 欧美一区高清| 国产欧美一区二区三区久久人妖| aⅴ色国产欧美| 亚洲自拍啪啪| 国产日产精品一区二区三区四区的观看方式| 亚洲最快最全在线视频| 一区二区三区日韩欧美| 欧美日韩一区二区三区免费看| 野花国产精品入口| 亚洲欧美在线免费观看| 国产精品日韩欧美一区二区三区| 亚洲一区久久久| 久久亚洲国产精品一区二区| 在线成人www免费观看视频| 模特精品在线| 一区二区三区毛片| 久久久久一区二区三区四区| 亚洲国产精品va在线看黑人| 欧美国产日本在线| 亚洲视频在线看| 美女脱光内衣内裤视频久久网站| 亚洲国产片色| 国产精品久久久99| 午夜精品99久久免费| 欧美丰满高潮xxxx喷水动漫| 日韩小视频在线观看专区| 国产精品日韩在线播放| 久久午夜电影网| 一区二区三区精品视频在线观看 | 麻豆久久婷婷| aa级大片欧美三级| 国产日韩欧美在线一区| 免费成人网www| 亚洲欧美国产不卡| 亚洲福利国产| 亚洲一级免费视频| 136国产福利精品导航网址| 欧美视频一区二区在线观看 | 99av国产精品欲麻豆| 国产一区二区三区电影在线观看| 欧美肥婆bbw| 久久精品人人爽| 一区二区国产在线观看| 欧美激情第六页| 久久精品麻豆| 欧美日韩中文精品| 久久久精品一区| 亚洲专区一区二区三区| 91久久久亚洲精品| 久久综合色播五月| 小黄鸭精品aⅴ导航网站入口| 亚洲国产日韩综合一区| 国产一区导航| 国产精品一区二区三区观看| 欧美日韩另类国产亚洲欧美一级| 久久人人爽国产| 久久精品官网| 欧美中文字幕在线| 西瓜成人精品人成网站|