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

CG@CPPBLOG

/*=========================================*/
隨筆 - 76, 文章 - 39, 評(píng)論 - 137, 引用 - 0
數(shù)據(jù)加載中……

2013年11月23日

用OBJC編程 9 - Conventions

用OBJC編程 9 - Conventions

  • 有些名字在你的app里必須唯一
  • 類名必須唯一,因此請(qǐng)使用前綴,建議使用三個(gè)字母的前綴,避免和Cocoa框架沖突,類名使用名詞
  • 方法名不要前綴,以小寫(xiě)字母開(kāi)始,多個(gè)參數(shù)時(shí),其它參數(shù)要有參數(shù)名。第一個(gè)單詞指明方法的效果,或者一個(gè)行為等等。
  • 如果方法參數(shù)包括error,它應(yīng)該是最后一個(gè)參數(shù),如果參數(shù)包括一個(gè)block,它應(yīng)該在最后,不應(yīng)該有多個(gè)block參數(shù)。方法名長(zhǎng)度要適中。
  • 避免縮寫(xiě)
  • 分類里的方法名加上前綴,避免沖突。
  • 局部變量應(yīng)該是唯一的。
  • 訪問(wèn)器的名稱要符合慣例。否則在KVC時(shí)可能不能工作。
  • 工廠方法名應(yīng)該以類名開(kāi)始(或者父類的類名)

posted @ 2013-11-23 11:33 cuigang 閱讀(309) | 評(píng)論 (0)編輯 收藏

用OBJC編程 8 - Dealing with Errors

用OBJC編程 8 - Dealing with Errors

使用NSError,

委托方法會(huì)產(chǎn)生Error
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
NSError包括錯(cuò)誤碼,錯(cuò)誤業(yè)務(wù)領(lǐng)域domain和描述。為保證每個(gè)錯(cuò)誤碼唯一,使用了domain,NSURLConnection的domain是NSURLErrorDomain

通過(guò)引用參數(shù)傳遞Error
-(BOOL)WriteToURL:(NSURL *)aURL option:(NSDataWritingOptions)mask error:(NSError**) errorPtr;
//////////////////////////
NSError *anyError;
BOOL sucess = [receivedData writeToURL:someLocalFileURL option:0 error:&anyError];
if(!success){
    NSLog(@"Write failed with error: %@", anyError);
    
//present error to user
}
// 如果writeToURL發(fā)生錯(cuò)誤,返回NO,并且更新anyError
// 如果你對(duì)error不感興趣,可以傳遞NULL

產(chǎn)生你自己的error
NSString *domain = @"com.MyCompany.MyApplication.ErrorDomain";
NSString *desc = NSLocalizedString(@"Unable to,,,"@"");
NSDictionary *userInfo = @{NSLocalizedDescriptionKey : desc};

NSError *error = [NSError errorWithDomain:domain code:-101 userInfo:userInfo];
//////////////////////
- (BOOL) doSomethingThatMayGenerateAnError:(NSError **)errorPtr;

//////////////////
-(BOOL)doSomethingThatMayGenerateAnError:(NSError **)errorPtr{
  
//,,,
  
// error occurred
  if(errorPtr){
    
*errorPtr = [NSError errorWithDomain:,,,  code:,,, userInfo:,,,];
  }
  
return NO;
}

使用異常
OBJC像其他語(yǔ)言一樣支持異常,NSException和NSError一樣是一個(gè)對(duì)象
@try{
   
// 可能導(dǎo)致異常
}
@catch (NSException *exception){
   
// 處理異常
}
@finally{
   
// 清理,處理無(wú)異常情況
}





posted @ 2013-11-23 11:14 cuigang 閱讀(383) | 評(píng)論 (0)編輯 收藏

2013年11月21日

用OBJC編程 7 - Working with Blocks

用OBJC編程 7 - Working with Blocks

Block 是語(yǔ)言級(jí)別的特性。它是一個(gè)OBJC的對(duì)象,可以被加入容器如NSArray或NSDictionary。它可以捕獲所處作用域的數(shù)值,非常類似其它語(yǔ)言的closure或者lambda。

語(yǔ)法
^{
    NSLog(@"This is a block");
}

可以像函數(shù)指針那樣聲明一個(gè)變量來(lái)持有這個(gè)block
void (^simpleBlock)(void);
simpleBlock = ^{
   NSLog(@"This is a block");
}; // 注意這里有一個(gè)分號(hào)

也可以這樣寫(xiě)
void (^simpleBlock)(void= ^{
    NSLog(@"This is a block");
};

調(diào)用這個(gè)block
simpleBlock();

帶上參數(shù)和返回值
^double (double firstValue, double secondValue){
    
return firstValue*secondValue;
}
// ,,,,,,,,,,,
double (^multiplyTwoValues)(doubledouble= 
    
^(double firstValue, double secondValue) { // 返回值類型可以省略
          return firstValue*secondValue;
     };

double result = multiplyTwoValues(2,4);
NSLog(@"The result is %f", result);

捕獲Enclosing Scope內(nèi)的值,一旦捕獲,這個(gè)值就不會(huì)變化,即便后續(xù)改變這個(gè)值
-(void)testMethod{
  
int anInteger = 42;
  
void (^testBlock)(void= ^{
       NSLog(@"Integer is: %i", anInteger);
  }
  anInteger = 84;
  testBlock(); // 仍然輸出42
}

使用__block
__block int anInteger = 42;
void (^testBlock)(void= ^{
  NSLog(@"Integer is: %i", anInteger);
};
anInteger = 84:
testBlock();  // output 84;

// ,,,,,,,,,,,,,

_block int anInteger = 42;
void (^testBlock)(void= ^{
  NSLog(@"Integer is: %i", anInteger); // output 42
  anInteger = 100;
};

testBlock();
NSLog(@"Value of original variable is now: %i", anInteger); // output 100;

通過(guò)參數(shù)傳遞Block,例如實(shí)現(xiàn)一個(gè)回調(diào)
-(IBAction)fetchRemoveInformation:(id)sender{
  [self showProgressIndicator];
  XYZWebTask *task = //,,,

  [task beginTaskWithCallbackBlock:^{
        [self hideProgressIndicator];
      }];
}

// beginTaskWithCallbackBlock 的定義是這樣的

-(void)beginTaskWithCallbackBlock:(void)(^)(void))callbackBlock{
  
//,,,
  callbackBlock();
}

最佳實(shí)踐是將block作為最后一個(gè)參數(shù),這樣便于閱讀。

也可以使用typedef簡(jiǎn)化語(yǔ)法
typedef void (^XYZSimpleBlock)(void);
//,,,,,,,,,,,,,,,
XYZSimpleBlock anotherBlock = ^/*,,,*/ };
//,,,,,,,,,,,,
-(void)beginFetchWithCallbackBlock:(XYZSimpleBlock)callbackBlock{
    
//,,,,
    callbackBlock();
}

可以將block作為屬性
@interface XYZObject : NSObject
@property (copy) void (^blockProperty)(void); // 必須使用copy
@end
//,,,,,,,,,,,,,,
self.blockProperty = ^/* ,,, */ };
self.blockProperty();

避免強(qiáng)引用循環(huán)
在block里捕獲self,諸如在一個(gè)callback block里,會(huì)引入內(nèi)存管理問(wèn)題。block會(huì)會(huì)維護(hù)一個(gè)捕獲對(duì)象的強(qiáng)引用,包括self
@interface XYZBlockKeeper : NSObject
@property (copy) void (^block)(void);
@end
////////////////////////
@implementation XYZBlockKeeper
-(void)configureBlock{
  self.block = ^{
    [self doSomething];    // 捕獲了一個(gè)self的強(qiáng)引用
                           
// 建立了一個(gè)強(qiáng)引用循環(huán)
  }
}
@end

上述代碼會(huì)產(chǎn)生一個(gè)編譯警告,為了避免這種情況,最佳實(shí)踐是捕獲一個(gè)self的弱引用
-(void)configureBlock{
   XYZBlockKeeper * __weak weakSelf = self;
   self.block = ^ {
      [weakSelf doSomething];
   };
}

block可以簡(jiǎn)化枚舉(略)
block可以簡(jiǎn)化并發(fā)任務(wù)(略)



posted @ 2013-11-21 19:20 cuigang 閱讀(339) | 評(píng)論 (0)編輯 收藏

用OBJC編程 6 - Value and Collections

     摘要: 用OBJC編程 6 - Value and CollectionsOBJC里可以用基本的C原生類型,也定義了一些擴(kuò)展的原生類型。BOOL類型,它的值是YES和NO,YES等于true等于1。NO等于false等于0。Cocoa定義了特殊的原生類型,如NSInteger和CGFloat。像NSInteger和NSUInteger,依賴于平臺(tái),在32位系統(tǒng)下是32位的,在64位下是64位的。通過(guò)API...  閱讀全文

posted @ 2013-11-21 17:34 cuigang 閱讀(365) | 評(píng)論 (0)編輯 收藏

用OBJC編程 5 - Working with Protocols

用OBJC編程 5 - Working with Protocols

協(xié)議定義了交互的消息
@protocol XYZPieChartViewDataSource
- (NSUInteger) numberOfSegments;
- (CGFloat)    sizeOfSegmentAtIndex:(NSUInteger)segmentIndex;
- (NSString *) titleForSegmentAtIndex:(NSUInteger)segmentIndex;
@end

數(shù)據(jù)源作為View的一個(gè)屬性,只要是符合協(xié)議的對(duì)象就可以,所以類型是id。
@interface XYZPieChartView : UIView
@property (weak) id <XYZPieChartViewDataSource> dataSource;
@end
委托和數(shù)據(jù)源屬性通常聲明為weak,以避免強(qiáng)引用循環(huán)。

設(shè)置屬性為一個(gè)不符合協(xié)議的對(duì)象,將會(huì)引起一個(gè)編譯時(shí)警告。

可選方法,使用@optional 和 @required
@protocol XYZPieChartViewDataSource
- (NSUInteger) numberOfSegments;
- (CGFloat)    sizeOfSegmentAtIndex:(NSUInteger)segmentIndex;
@optional
- (NSString *) titleForSegmentAtIndex:(NSUInteger)segmentIndex;
- (BOOL)       shouldExplodeSegmentAtIndex:(NSUInteger)segementIndex;
@required
- (UIColor *)  colorForSegmentAtIndex:(NSUInteger)segementIndex;
@end

運(yùn)行時(shí)檢查可選方法
如果一個(gè)方法是可選的,那么在調(diào)用前應(yīng)該檢查它是否實(shí)現(xiàn)。
NSString *thisSegmentTitle; // Local object variables are automatically initialized to nil
if([self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]){
    thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index];
}

respondsToSelector: 方法用了一個(gè)selector,@selector。
如上定義一個(gè)符合協(xié)議的id類型,調(diào)用respondsToSelector,會(huì)產(chǎn)生一個(gè)編譯時(shí)錯(cuò)誤,解決方案是聲明對(duì)象符合NSObject協(xié)議

從協(xié)議繼承
最佳實(shí)踐是,你的協(xié)議依從NSObject協(xié)議。NSObject對(duì)象依從NSObject協(xié)議。
一旦你的協(xié)議依從NSObject協(xié)議,那么依從你協(xié)議的任何對(duì)象都必須實(shí)現(xiàn)NSObject協(xié)議的方法,但因?yàn)樗鼈儜?yīng)該是NSObject的子類,你就不必自己實(shí)現(xiàn)這些NSObject的方法。依從NSObject協(xié)議非常有用。
@protocol MyProtocol <NSObject>

@end

comform 一個(gè)協(xié)議
@interface MyClass : NSObject <MyProtocol, AnotherProtocol>

@end
如果一個(gè)類聲明了大量的協(xié)議,意味著代碼需要重構(gòu)成多個(gè)小的類。

一旦聲明依從某個(gè)協(xié)議,就必須實(shí)現(xiàn)所有的required方法,和需要的optional方法,否則編譯器會(huì)給出警告。方法的簽名必須相同。

Cocoa 和 Cocoa Touch 定義了大量的protocol
  • view的數(shù)據(jù)源協(xié)議
  • view的委托協(xié)議delegate
  • 一些類似的類,但是無(wú)繼承關(guān)系,比如NSArray和NSDictionary依從NSCoding協(xié)議
  • 一些OBJC語(yǔ)言級(jí)特性,也依賴協(xié)議,如一個(gè)容器需要依從NSFastEnumeration協(xié)議才能使用快速枚舉fast enumeration;copy的屬性依從NSCopying協(xié)議,否則會(huì)得到一個(gè)運(yùn)行時(shí)異常。

為匿名使用協(xié)議

有時(shí)候,一個(gè)框架的開(kāi)發(fā)者為了向使用者隱藏一個(gè)類,只把它的接口通過(guò)協(xié)議暴露

id <XYZFrameworkUtility> utility = [frameworkObject anonymousUtility];

例如NSFetcheResultsController
NSInteger sectionNumber = //,,,
id <NSFetchedResultSectionInfo> sectionInfo = 
          [self.fetchedResultsController.sections objectAtIndex:sectionNumber];
NSInteger numberOfRowsInSection = [sectionInfo numberOfObjects];





posted @ 2013-11-21 09:32 cuigang 閱讀(353) | 評(píng)論 (0)編輯 收藏

2013年11月20日

用OBJC編程 4 - Customizing Existing Classes

用OBJC編程 4 - Customizing Existing Classes

通過(guò)Category為類增加方法
#import "XYZPerson.h"
@interface XYZPerson (XYZPersonNameDisplayAddtions)
- (NSString *)lastNameFirstNameString;
@end
// ----------------------
#import "XYZPerson+XYZPersonNameDisplayAddtions.h"
@implementation XYZPerson (XYZPersonNameDisplayAddtions)
- (NSString *)lastNameFirstNameString{
  
return [NSString stringWithFormat:@"%@ %@", self.lastName, self.firstName];
}
@end
//-------------------------------
#import "XYZPerson+XYZPersonNameDisplayAddtions.h"
@implementation SomeObject
-(void) someMethod{
  XYZPerson *person = [[XYZPerson alloc] initWithFirstName:@"John", lastName:@"Doe"];
  NSLog(@"The people is %@", [person lastNameFirstNameString]);
}
@end

Category 可以增加任何的實(shí)例方法和類方法,但是通常不適合增加Property,雖然語(yǔ)法上可以聲明一個(gè)Property,但不能通過(guò)Category增加一個(gè)實(shí)例變量。這意味著不能synthesize任何實(shí)例變量, 也沒(méi)有存取方法。 你可以寫(xiě)自己的accessor,但是不能keep track property,它們存儲(chǔ)在原始的類里。

避免名字沖突
Category 的新增方法可能會(huì)導(dǎo)致名字沖突,在運(yùn)行時(shí)可能會(huì)出現(xiàn)未知的行為,為了避免這種情況,需要增加前綴
@interface NSSortDescriptor (XYZAdditions)
+ (id)xyz_sortDescriptorWithKey:(NSString *)key ascending:(BOOL)ascending;
@end
//  ------ use it -------
NSSortDescriptor *descriptor = [NSSortDescriptor xyz_sortDescriptorWithKey:@"name" ascending:YES];

類擴(kuò)展類似分類,但只能用于編譯時(shí)有源碼情況,并且必須寫(xiě)在實(shí)現(xiàn)文件里,因此不能通過(guò)這個(gè)為框架類擴(kuò)展。擴(kuò)展語(yǔ)法類似分類
@interface ClassName ()
{
    id _someCustomInstanceVariable;
}
@property NSObject *extraProperty;
@end
也叫匿名分類。不像分類那樣,擴(kuò)展可以增加屬性和實(shí)例變量。編譯器會(huì)自動(dòng)synthesize accessor方法。如果你增加方法,必須實(shí)現(xiàn)在主要的@implementation代碼塊里。

可以用擴(kuò)展來(lái)聲明私有屬性和方法
@interface XYZPerson:NSObject
@proerty (readonly) NSString *uniqueIdentifier;
-(void)assignUniqueIdentifier;
@end

/// ---------------------

@interface XYZPerson ()
@property (readwrite) NSString *uniqueIdentifier;
@end

@implementation XYZPerson
// ,,,
@end
像上面那樣重復(fù)聲明uniqueIdentifier為readwrite,每一個(gè)運(yùn)行時(shí)的XYZPerson對(duì)象都將存在一個(gè)setter。
任何訪問(wèn)私有方法,或者set一個(gè)readonly屬性的行為,編譯器都會(huì)產(chǎn)生錯(cuò)誤,但是可以通過(guò)動(dòng)態(tài)運(yùn)行時(shí)特性避免編譯器錯(cuò)誤,諸如調(diào)用NSObject的performSelector方法。

如果你打算構(gòu)建私有方法或?qū)傩裕憧梢月暶饕粋€(gè)分離的頭文件來(lái)聲明擴(kuò)展,諸如XYZPerson.h和XYZPersonPrivate.h

分類和擴(kuò)展并不是定制一個(gè)類的唯一途徑,也不是最好方法,要考慮可否使用子類化或者委托的方法來(lái)實(shí)現(xiàn)。


posted @ 2013-11-20 18:55 cuigang 閱讀(293) | 評(píng)論 (0)編輯 收藏

用OBJC編程 3 -Encapsulating Data

用OBJC編程3-Encapsulating Data

@interface XYZPerson :NSObject
@property NSString *firstName;
@property NSString *lastName;
@end

/// ============

NSString *firstName = [somePerson firstName];
[somePerson setFirstName:@"Johnny"];

限定屬性為只讀,也可限定為readwrite,但這不必,因?yàn)槿笔∪缡恰?/span>
@property (readonly) NSString *fullname;

可以指定屬性的訪問(wèn)器名稱,多個(gè)限定詞如下格式
@property (readonly, getter=isFinished) BOOL finished;

使用點(diǎn)語(yǔ)法
NSString *firstName = somePerson.firstName;
// NSString *firstName = [somePerson firstName];
somePerson.firstName = @"Johnny";
// [somePerson setFirstName:@"Johnny"];

大多數(shù)屬性有一個(gè)實(shí)例變量。
缺省的讀寫(xiě)屬性會(huì)由編譯器自動(dòng)生成一個(gè)實(shí)例變量,以下劃線開(kāi)始,如_firstName;
-(void) someMethod{
  NSString *myString = @"An interesting string";
  _someString = myString;
  
// self.someString = myString;
  
// or
  
// [self setSomeString:myString];
}

可以指定實(shí)例變量的名字
@implementation YourClass
@synthesize propertyName = instanceVariableName;
@end
// ---- for example

@synthesize firstName = ivar_firstName;

如果你不指定名字,實(shí)例變量則和屬性同名,前面沒(méi)有下劃線
@synthesize firstName;

如果你并不想提供數(shù)值給其它對(duì)象,你不必聲明一個(gè)屬性而使用一個(gè)實(shí)例變量
@interface SomeClass: NSObject{
  NSString *_myNonPropertyInstanceVariable;
}
@end

@implementation SomeClass{
  NSString *_anotherCustomInstanceVariable;
}

在初始化方法里訪問(wèn)實(shí)例變量
Setter方法會(huì)有附加效果。它們可能觸發(fā)KVC通知,或者完成你定制的方法。
你應(yīng)該在初始化方法里直接訪問(wèn)實(shí)例變量,因?yàn)閷?duì)象還沒(méi)有初始化完成。甚至你不應(yīng)該提供定制的訪問(wèn)器方法給你的類提供附加效果。這樣將來(lái)的子類可以很好的override這個(gè)行為。
一個(gè)典型的init方法如下
-(id)init{
  self = [super init];
  
if(self){
    
// initialize instance variables here
  }
  
return self;
}

可以指定初始化方法
-(id)initWithFirstName:(NSString *)aFirstName lastName:(NSString *)aLastName{
  self = [super init];
  
if(self){
    _firstName = aFirstName;
    _lastName = aLastName;
  }
  
return self;
}

可以指定訪問(wèn)方法
@property (readonly) NSString *fullName;
// -------------
-(NSString *)fullName{
 
return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName];
}

如果你需要在訪問(wèn)器里訪問(wèn)實(shí)例變量,那應(yīng)該直接訪問(wèn)。例子里延遲初始化一個(gè)對(duì)象,lazy accessor。
- (XYZObject *)someImportantObject {
  
if(!_someImportantObject){
    _someImportantObject = [[XYZObject alloc] init];
  }
  
return _someImportantObject;
}

編譯器會(huì)自動(dòng)synthesize一個(gè)實(shí)例變量。至少一個(gè)訪問(wèn)方法。如果你為readwrite屬性實(shí)現(xiàn)了getter和setter,或者為readonly實(shí)現(xiàn)了getter。編譯器認(rèn)為你想控制屬性實(shí)現(xiàn),也不會(huì)再為你自動(dòng)生成一個(gè)實(shí)例變量。因此,如果你仍然需要一個(gè)實(shí)例變量,你需要手動(dòng)synthesize
@synthesize property = _property;

屬性缺省是原子性的。atomic
@interface XYZObject : NSObject
@property NSObject *implicitAtomObject;                  // 缺省是atomic
@property (atomic) NSObject *explicitAtomicObject;       // 指明atomic
@end
缺省訪問(wèn)器已經(jīng)解決了多線程并發(fā)的問(wèn)題。

如果你定制了一個(gè)atomic, readwrite的屬性的setter,而讓編譯器自動(dòng)生成getter,將會(huì)得到一個(gè)編譯時(shí)警告。

你可以聲明nonatomic屬性,因?yàn)椴恍枰猤uarantee,處理并發(fā),因此它的訪問(wèn)器比atomic屬性更快。

屬性的原子性并不意味著對(duì)象是線程安全的。例如firstName和LastName。

管理對(duì)象的生命周期,對(duì)象是通過(guò)指針來(lái)訪問(wèn),內(nèi)存是動(dòng)態(tài)申請(qǐng)的,指針變量的生命周期不代表對(duì)象的證明周期。strong reference意味著對(duì)象和另一個(gè)對(duì)象的生命周期一樣長(zhǎng)。
屬性缺省是強(qiáng)引用,可以指定weak。本地變量都是強(qiáng)引用,如果你不希望維護(hù)一個(gè)強(qiáng)引用,可以使用__weak
@property (weak) id delegate;
// ---------
NSObject * __weak weakVariable;

弱引用會(huì)帶來(lái)不安全的行為,因?yàn)樽兞靠赡軙?huì)被置為nil。
一些Cocoa類不能聲明為弱引用,包括NSTextView, NSFont, NSColorSpace等,如果你需要使用這些類的一個(gè)弱引用,你需要一個(gè)unsafe_unretained聲明。
@property (unsafe_unretained) NSObject *unsafePropery;
// ------------
NSObject * __unsafe_unretained unsafeReference;
unsafe引用類似weak引用,但當(dāng)對(duì)象釋放時(shí),它不會(huì)被置為nil,因此你可能會(huì)持有一個(gè)懸掛指針,指向一個(gè)未知內(nèi)存,向它發(fā)消息可能會(huì)導(dǎo)致崩潰。

copy屬性
@interface XYZBadgeView : NSView
@property NSString *firstName;
@peoperty NSString *lastName;
@end

如果你這樣做
NSMutableString *nameString = [NSMutableString stringWithString:@"John"];
self.badgeView.firstName = nameString;
// ----
[nameString appendString:@"ny"];
這樣firstName將指向一個(gè)NSMutableString,它的值可以改變了,你可以增加copy聲明,避免這種情況

@interface XYZbadgeView : NSView
@property (copy) NSString *firstName;
@property (copy) NSString *lastName;
@end
// --------------------
NSMutableString *nameString = [NSMutableString stringWithString:@"John"];
self.badgeView.firstName = nameString;
// ----
[nameString appendString:@"ny"];
這樣firstName仍然是“John”,不會(huì)發(fā)生變化

一個(gè)被聲明為copy的對(duì)象必須支持NSCopying協(xié)議。如果你要直接set一個(gè)copy屬性的實(shí)例變量,例如在初始化方法里,一定要設(shè)置原始對(duì)象的copy
-(id)initWithSomeOriginalString:(NSString *)aString{
  self = [super init];
  
if(self){
     _instanceVariableForCopyProperty = [aString copy];
  }
  
return self;
}


posted @ 2013-11-20 16:49 cuigang 閱讀(288) | 評(píng)論 (0)編輯 收藏

2013年11月19日

用OBJC編程 2 - working with Objects

用OBJC編程 2 - working with Objects

發(fā)送和接收消息
@interface XYZPerson : NSObject
-(void) sayHello;
@end

// implemetation
@implementation XYZPerson
- (void) sayHello{
    NSLog(@"Hello, world!");
}
@end // XYZPerson

// -----
[somePerson sayHello];

通過(guò)指針keep對(duì)象

-(void)myMethod{
  NSString *myString = // get a string from somewhere.
}

通過(guò)參數(shù)傳遞對(duì)象
-(void)saySomething:(NSString *)greeting;
// implementation
-(void)saySomething:(NSString *)greeting{
    NSLog(@"%@", greeting);   // "%@",用來(lái)打印對(duì)象
}

通過(guò)返回值傳遞
-(NSString *)magicString;
//implementation
-(NSString *)magicString{
    NSString *stringToReturn = // create string
    return stringToReturn;
}
// use it
NSString *magic = [testString magicString];

向自己發(fā)送消息
@implementation XYZPerson
-(void)sayHello{
  [self saySomething:@"Hello, world!"];
}
-(void)saySomething:(NSString *)greeting{
  NSLog(@"%@", greeting);
}
@end

向父類發(fā)消息
@interface XYZShoutingPerson : XYZPerson
@end
/////////////////////
@implementation XYZShoutingPerson
-(void)saySomething:(NSString *)greeting{
  NSString *uppercaseGreeting = [greeting uppercaseString];
  [super saySomething:uppercaseGreeting];
}
@end

動(dòng)態(tài)創(chuàng)建對(duì)象
// NSObject提供一個(gè)類方法, id like (NSObject *)
+(id)alloc;
// 
-(id)init;
//=============== use it
NSObject *newObject = [[NSObject alloc] init];

// init可能返回一個(gè)和alloc不同的對(duì)象,因此最好嵌套使用alloc和init,不推薦如下使用
NSObjet *someObject = [NSObject alloc];
[someObject init];

初始化方法可以帶參數(shù)
-(id)initWithInt:(int)value;
-(id)initWithLong:(long)value;
//------------------
NSNumber *magicNumber = [[NSNumber alloc] initWithInt:42];

類工廠方法提供了另一個(gè)選擇
+(NSNumber *)numberWithInt:(int)value;
+(NSNumber *)numberWithLong:(long)value;
//------------------
NSNumber *magicNumber = [NSNumber numberWithInt:42];

使用new來(lái)代替
XYZObject *object = [XYZObject new];
// is effectively the same as:
XYZObject *object = [[XYZObject alloc] init];

通過(guò)字面量創(chuàng)建
NSString *someString = @"Hello, world!";
// is same as
NSString *someString = [NSString stringWithCString:"Hello, world!" encoding:NSUTF8StringEncoding];

//=======
NSNumber *myBOOL = @YES;
NSNumber *myFloat = @3.14f;
NSNumber *myInt = @42;
NSNumber *myLong = @42L;
NSNumber *myInt2 = @(84 / 2);

OBJC 是一個(gè)動(dòng)態(tài)語(yǔ)言
// 下面代碼會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤,因?yàn)镹SString沒(méi)有removeAllObjects方法
id someObject = @"Hello, World!";
[someObject removeAllObjects];

// 下面代碼會(huì)產(chǎn)生編譯時(shí)錯(cuò)誤
NSString *someObject = @"Hello, World!";
[someObject removeAllObjects];

比較對(duì)象
// 因?yàn)槭侵羔槪钥梢赃@樣比較是否同一個(gè)對(duì)象
if(firstPerson == secondPerson){
  
// the same object
}
// 如果要比較數(shù)據(jù)是否相同,使用isEqual
if([firstPerson isEqual:secondPerson]) {
  
// is identical to second
}

使用nil
// nil 是一個(gè)對(duì)象指針,聲明一個(gè)對(duì)象指針無(wú)需初始化,編譯器會(huì)初始化它為nil
XYZPerson *somePerson;
// ------------
if(somePerson != nil){
  
// ====
}
// or 
if(somePerson){
   
// ===
}

posted @ 2013-11-19 23:11 cuigang 閱讀(273) | 評(píng)論 (0)編輯 收藏

用OBJC編程 0-簡(jiǎn)介 & .1 定義類

<Programming with Objective-C>-0-Introduction

OBJC是OSX和IOS的主要編程語(yǔ)言,它是C的超集,提供了面向?qū)ο蟮奶匦院蛣?dòng)態(tài)運(yùn)行時(shí)類型信息。OBJC繼承了C的語(yǔ)法,基本數(shù)據(jù)類型和流程控制,附加了定義類和方法的語(yǔ)法。也為動(dòng)態(tài)類型綁定提供了語(yǔ)言級(jí)別的支持。

<Programming with Objective-C>-1-Defining Classes

可變性決定值是否可以更改
一些類定義對(duì)象是immutable的,意味著對(duì)象的內(nèi)容不可被其它對(duì)象改變。NSString和NSNumber是immutable的

一些immutable類頁(yè)游mutable版本。比如NSString的NSMutableString。

盡管NSString和NSMutableString是不同的類,它們有非常多的相似之處

從另一個(gè)類繼承
從另一個(gè)類繼承,子類繼承了父類所有的行為和屬性。也可以定義自己的behavior和properties,或者override父類的behavior

NSMutableString繼承于NSString,因此擁有所有NSString的功能,也增加了append,insert,replace,delete substring等方法

根類提供基本功能
如果你定義一個(gè)自己的類,應(yīng)該至少繼承于NSObject

類的接口定義

基本語(yǔ)法
1 @interface SimpleClass : NSObject
2 
3 @end

Properties控制訪問(wèn)一個(gè)對(duì)象的值
@interface Person : NSObject

@property NSString 
*firstName; // 對(duì)象用指針
@property NSString *lastName;
@property NSNumber 
*yearOfBirth;
@property 
int yearOfBirth_1; // 用基本類型

@end

Property屬性指明數(shù)據(jù)的可訪問(wèn)性和存儲(chǔ)情況
@interface Person : NSObject
@property (
readonly) NSString* firstName;
@property (
readonly) NSString* lastName;
@end

方法定義
-(void)someMethod;
前面的 - 號(hào)表示這是一個(gè)實(shí)例方法

方法可以帶參數(shù)

-(void)someMethodWithValue:(SomeType)value;

可以有多個(gè)參數(shù)
-(void)someMethodWithFirstValue:(SomeType)value1 secondValue:(AnotherType)value2;
secondValue 是第二個(gè)參數(shù)簽名的一部分

因此,下面的函數(shù)簽名不同:
-(void)someMethodWithFirstValue:(SomeType)info1 anotherValue:(AnotherType)info2;
-(void)someMethodWithFirstValue:(SomeType)info1 secondValue:(YetAnotherType)onfo2;

類名稱必須唯一
類名必須唯一,甚至和庫(kù)或者框架里的類也不能重名,建議使用三個(gè)字符的前綴。
兩個(gè)字母前綴,如NS,UI,已經(jīng)被Apple保留

類的實(shí)現(xiàn)

基本語(yǔ)法

#import "XYZPerson.h"

@implementation XYZPerson

@end

實(shí)現(xiàn)方法

// interface like this
@interface XYZPerson : NSObject
- (void)sayHello;
@end

// implementation like this

@implementation XYZPerson
- (void)sayHello{
   NSLog(
@"Hello, World!");
}
@end

類也是一個(gè)對(duì)象

在OBJC里,類自己也是一個(gè)Class類型的對(duì)象。類類型不能通過(guò)聲明的語(yǔ)法定義property,但是它可以接收消息。

類類型的方法的典型用途是工廠方法,用來(lái)進(jìn)行對(duì)象的分配和初始化,如NSString的工廠方法

+(id)string;
+(id)stringWithString:(NSString *)aString;
+(id)stringWithFormat:(NSString *)format,.. . ;
+(id)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)end error:(NSError **)error;
+(id)stringWithCString:(const char*)cString encoding:(NSStringEncoding)enc;

+ 號(hào)表示這是一個(gè)類的方法

posted @ 2013-11-19 18:34 cuigang 閱讀(661) | 評(píng)論 (0)編輯 收藏

2013年11月17日

UTF8 to Unicode

1 //unicode      bin                           utf8
2 0x0000~0x007f  0xxxxxxx                    0x00~0x7f
3 0x0080~0x07ff  110xxxxx 10xxxxxx           0xCx 0x8x ~ 0xDx 0xBx
4 0x0800~0xffff  1110xxxx 10xxxxxx 10xxxxxx  0xEx 0x8x 0x8x ~ 0xEx Bx Bx

posted @ 2013-11-17 10:31 cuigang 閱讀(312) | 評(píng)論 (0)編輯 收藏

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久爱www.| 国产欧美1区2区3区| 久久全球大尺度高清视频| 国产精品国产亚洲精品看不卡15| 亚洲乱码精品一二三四区日韩在线| 亚洲天堂av图片| 在线综合亚洲欧美在线视频| 一区二区高清| 国产日韩专区| 欧美成人午夜激情| 性久久久久久| 宅男噜噜噜66一区二区| 欧美成人中文| 久久深夜福利免费观看| 亚洲一区二区在线播放| 亚洲激情综合| 极品少妇一区二区| 国产精品乱人伦一区二区 | 亚洲性感激情| 国产午夜精品一区二区三区欧美 | 亚洲狼人综合| 亚洲精品综合| 国产亚洲精品v| 国产精品久久久久7777婷婷| 欧美成人a视频| 免费在线国产精品| 久久久久久久久久久久久女国产乱 | 91久久精品日日躁夜夜躁国产| 国产精品家庭影院| 欧美精品免费看| 久久久久久9999| 欧美一级视频免费在线观看| 亚洲一区久久久| 久久精品国产综合| 久久不射2019中文字幕| 亚洲欧美日韩一区二区三区在线| 亚洲人成网站影音先锋播放| 国自产拍偷拍福利精品免费一| 国产精品夜夜夜| 国产精品毛片一区二区三区| 欧美日韩免费一区| 国产精品www.| 国产欧美在线观看一区| 久久精品欧美日韩精品| 久久噜噜噜精品国产亚洲综合| 久久国产精品免费一区| 久久精品国产999大香线蕉| 欧美一级免费视频| 久久精品人人做人人爽| 久久综合狠狠| 欧美激情综合网| 国产精品s色| 欧美性做爰猛烈叫床潮| 国产综合自拍| 伊人久久久大香线蕉综合直播| 精品av久久久久电影| 亚洲福利国产| 一本色道综合亚洲| 午夜日本精品| 久久综合九色综合欧美就去吻| 免费不卡在线观看| 蜜乳av另类精品一区二区| 欧美第一黄色网| 日韩一级精品视频在线观看| 亚洲欧美激情一区| 麻豆91精品| 欧美日精品一区视频| 国产欧美精品一区二区色综合| 狠狠色丁香久久婷婷综合_中| 亚洲国产欧美一区二区三区久久| 日韩亚洲精品在线| 久久国产精品久久久| 欧美国产日本| 午夜亚洲伦理| 久久亚洲一区| 欧美激情成人在线视频| 国产精品女人网站| 亚洲成在人线av| 最新精品在线| 欧美一区免费视频| 亚洲黄色在线| 欧美一激情一区二区三区| 美女尤物久久精品| 国产日韩欧美在线视频观看| 国产精品亚洲精品| 亚洲精品久久久蜜桃| 久久精品国产99精品国产亚洲性色 | 在线免费一区三区| 在线日韩中文| 欧美亚洲视频| 艳妇臀荡乳欲伦亚洲一区| 久久久免费观看视频| 国产精品免费aⅴ片在线观看| 亚洲精品在线免费| 免费久久久一本精品久久区| 亚洲午夜在线观看| 欧美日韩精品久久| 亚洲日韩欧美视频一区| 欧美一区二区三区免费看| 久久精品一区蜜桃臀影院 | 国产资源精品在线观看| 日韩系列欧美系列| 正在播放欧美视频| 亚洲精品欧美日韩专区| 欧美精品 国产精品| 亚洲日本中文字幕| 欧美成人精品一区二区| 欧美一区二区成人6969| 国产精品一卡| 午夜精品久久久久久久99热浪潮| 亚洲精品乱码久久久久久| 久久av二区| 国产亚洲永久域名| 久久久久.com| 欧美一区二区三区在| 国产美女一区| 久久久久女教师免费一区| 欧美一区二区在线| 激情久久久久久久久久久久久久久久| 久久久国产精品一区二区中文| 亚洲综合三区| 国产美女精品一区二区三区| 欧美一区2区三区4区公司二百| 亚洲一区二区三区免费视频| 国产精品免费区二区三区观看| 午夜久久影院| 一区二区成人精品| 国产精品一香蕉国产线看观看| 欧美在线观看网站| 久久久久在线观看| 亚洲九九精品| 亚洲一区二区三区视频播放| 国产欧美日韩另类视频免费观看| 久久久久久亚洲精品中文字幕| 亚洲欧美日韩精品久久亚洲区 | 久久精品国内一区二区三区| 国产视频亚洲| 亚洲视频在线二区| 香蕉久久国产| 国产精品毛片va一区二区三区| 亚洲丝袜av一区| 亚洲午夜一级| 国产精品国产三级国产专播精品人| 99精品国产在热久久| 亚洲一级黄色av| 国产精品美女久久久| 一区二区欧美激情| 亚洲一区二区三区在线观看视频| 欧美日韩亚洲视频| 亚洲一区二区三区四区五区午夜| 亚洲欧美成人在线| 国产亚洲毛片在线| 久久久国产视频91| 亚洲第一伊人| 夜夜嗨一区二区| 国产精品久久77777| 欧美一二三视频| 欧美刺激午夜性久久久久久久| 91久久久在线| 国产精品久久久久99| 欧美在线观看www| 欧美肥婆bbw| 亚洲无玛一区| 国产亚洲女人久久久久毛片| 久久人人97超碰人人澡爱香蕉 | 性色av一区二区三区在线观看| 亚洲精品综合| 午夜精品久久久久久久久久久久久| 国产欧美日韩另类一区| 久久麻豆一区二区| 99精品视频免费全部在线| 欧美一区二区三区的| 在线观看欧美日本| 欧美午夜精品一区| 久久国产66| av成人手机在线| 欧美gay视频| 校园激情久久| 91久久精品国产| 国产精品免费一区二区三区观看| 久久久夜夜夜| 亚洲欧美卡通另类91av | 欧美国产在线电影| 亚洲综合三区| 亚洲精品免费看| 国产欧美一区二区精品忘忧草| 免费的成人av| 欧美中文字幕视频在线观看| 亚洲日本中文字幕免费在线不卡| 久久精品成人| 亚洲一区免费看| 亚洲精品美女在线观看播放| 国产亚洲精品综合一区91| 欧美日韩一区二区三区免费| 欧美专区日韩专区| 亚洲尤物精选| 亚洲香蕉在线观看| 日韩视频在线一区二区| 亚洲电影专区| 毛片一区二区|