1. Trang chủ
  2. » Công Nghệ Thông Tin

[Bài Học Số 2] Cơ Bản Objective Cx

19 448 3
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Cơ Bản Objective C
Trường học University of Information Technology
Chuyên ngành Computer Science
Thể loại bài học
Thành phố Ho Chi Minh City
Định dạng
Số trang 19
Dung lượng 36,85 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Lập trình ios

Trang 1

1.1 Lớp

1.1.1 Các khái niệm cơ bản

1.1.1.1 Định nghĩa lớp

Một lớp trong Objective-C được định nghĩa gồm 2 file thành phần tương tự C, C++ Một file

*.h định nghĩa trước các biến thành phần và tên các phương thức, file *.m định nghĩa phần thực thi cho các phương thức trong file *.h

File ClassName.h

PHP Code:

#import <headerFile.h> 

variable1 declaration; 

variable2 declaration; 

method1 declaration; 

method2 declaration; 

@end  

Objective-C sử dụng từ khóa @interface để khai báo một tên lớp trong file h Từ khóa @end được sử dụng ở cuối phần khai báo

File ClassName.m

PHP Code:

#import “ClassName.h” 

  

@implementation ClassName 

-method 1 //triển khai phương thức 1 

-method 2 // triển khai phương thức 2 

@end  

Trang 2

Objective-C sử dụng từ khóa @implementation để khai báo phần thực thi thực sự của lớp trong file m Từ khóa @end được sử dụng ở cuối phần khai báo

Ví dụ:

PHP Code:

MyClass  

int a; 

int b; 

-(void) setvara : (int) x  

-(void) setvarb : (int) y  

-(int) add; 

@end  

MyClass.m

PHP Code:

#import”MyClass.h” 

  

@implementation MyClass 

-(void) setvara  int) x { 

a x  

-(void) setvarb  int) y { 

b y  

-(int) add { 

Trang 3

1.1.1.2 Thuộc tính

Cú pháp khai báo thuộc tính:

PHP Code:

[Access Privilege] TypeName  varName;  

Ví dụ

PHP Code:

@private 

int  att1; 

NSString str1; 

int att2; 

@public 

NSString str2; 

int att3;  

Mặc định khi không sử dụng từ khóa quyền truy xuất là @protected

1.1.1.3 Phương thức

Cú pháp định nghĩa một phương thức

PHP Code:

[Access Privilege](return_type) methodname: (type1) para1 : (type2) para2 ( ); 

 

Gọi phương thức

PHP Code:

[object methodname:para1 : para2…];  

Ví dụ:

Trang 4

Khai báo

PHP Code:

-(MyClass*) constructor: (int) a : (int) b;  

Triển khai

PHP Code:

-(MyClass*) constructor: (int) a : (int) b { 

self = [super init]; 

if(self) { 

var1 = a  

var2 = b  

return self; 

}  

Lời gọi phương thức như sau

PHP Code:

[myClassObject constructor: 100 : 200];  

Trong Objective-C chỉ có 2 khái niệm quyền truy xuất đến phương thức: truy xuất hoàn toàn qua lớp (public static) và truy xuất hoàn toàn qua đối tượng (public)

Objective-C qui định phần định nghĩa truy xuất như sau

Phương thức truy xuất thông qua tên lớp sẽ có ký hiệu là dấu +

Phương thức truy xuất thông qua đối tượng sẽ có ký hiệu là dấu –

PHP Code:

-(MyClass*) staticMethod: (int) a : (int) b  

-(MyClass*) publicMethod: (int) a : (int) b  

@end  

Trang 5

Trong trường hợp phương thức có nhiều tham số, và để thể hiện được ý nghĩa của các tham

số trong lời gọi phương thức, Objective-C cho phép một cú pháp khai báo khác cho phương thức như sau:

PHP Code:

[Access Privlilege](return_type) methodPara1: (type) para1 andPara2: (type) pa ra2;  

Lời gọi phương thức khi đó sẽ như sau:

PHP Code:

[object methodPara1: value1 andPara2: value2];  

Ví dụ:

PHP Code:

-(void) setX: (int) x Y: (int) y;  

PHP Code:

-(void) setX: (int) x Y: (int) y { 

var1 = x  

var2 = y  

}  

PHP Code:

[myObject setX: 15 Y: 20];  

1.1.2 Kế thừa

Tính kế thừa trong Objective-C tương tự trong các ngôn ngữ khác như C++,…

PHP Code:

#import “SuperClass.h” 

#import <headerFile.h> 

  

Trang 6

variable1 declaration; 

variable2 declaration; 

method1 declaration; 

method2 declaration; 

@end  

Ví dụ:

PHP Code:

#import<Foundation/NSObject.h> 

  

@interface MyClass:NSObject { 

int a; 

int b; 

-(void) setvara : (int) x  

-(void) setvarb : (int) y  

-(int) add; 

@end  

Trong Objective-C, thực sự tất cả các lớp khi tạo ra đều kế thừa từ lớp NSObject

1.1.3 Phương thức tạo

Trong Objective-C không có khái niệm phương thức tạo cho một lớp Tất cả các đối tượng của một lớp phải được cấp phát thông qua phương thức alloc và init

PHP Code:

MyClass *myObject = [[MyClass alloc]init];  

Trang 7

Trong đó phương thức alloc là cấp phát vùng nhớ, còn phương thức init như là một phương thức tạo mặc định trong Objective-C, được định nghĩa trong lớp NSObject

PHP Code:

-(id) init;  

Ta thường định nghĩa lại phương thức tạo có tham số của một lớp như sau:

PHP Code:

#import “SuperClass.h” 

#import <headerFile.h> 

  

@interface MyClass: NSObject { 

int var1; 

int var2; 

-(MyClass*) constructor: (int) a : (int) b  

@end  

PHP Code:

#import “MyClass.h” 

  

@implementation MyClass 

-(MyClass*) constructor: (int) a : (int) b { 

self = [super init]; 

if(self) { 

var1 = a  

var2 = b  

return self; 

Trang 8

Từ khóa super con trỏ trỏ đến lớp cha của lớp hiện tại, tương tự như base trong C++ hoặc super trong Java

Từ khóa self là con trỏ đại diện cho lớp hiện tại, tương tự con trỏ this trong C++ hay Java

1.1.4 Properties

Trong Objective-C hỗ trợ tính năng Properties, cho phép chúng ta định nghĩa các bộ truy xuất (setter/getter) vì vậy sẽ có nhiều lợi ích sử dụng khi truy xuất đến các biến thể hiện của đối tượng

Định nghĩa trong file.h:

PHP Code:

  @property (<attributes>) type propertyName;  

Thực thi trong file.m:

PHP Code:

@synthesize propertyName;  

Truy xuất đến properties thông qua cú pháp object.property

PHP Code:

#import <Foundation/Foundation.h> 

  

int countryCode; 

int cityCode; 

@property (readonly) int countryCode; 

@property int cityCode; 

… 

@end  

PHP Code:

#import “Address.h” 

  

Trang 9

@synthesize countryCode; 

@synthesize cityCode; 

… 

@end  

PHP Code:

Address *address = [[Address alloc] init]; 

Int code = address.countryCode; 

address.cityCode = 99;  

Các thuộc tính cho Properties

Writability

readwrite: chỉ ra Properties có thể đọc và ghi, thuộc tính này là mặc định

read-only: chỉ ra Properties chỉ có thể đọc

Setter Semantics

assign: là thuộc tính mặc định Ta thường sử dụng assign cho các kiểu vô hướng như NSInteger, CGRect…

Ta có thể hình dung như sau

PHP Code:

@interface Test5 : NSObject { 

@private NSString *sVar; 

@property (readwrite, assign) NSString *sVar; 

@end  

Properties này tương tự như settor sau

PHP Code:

-(void)setSVar:(NSString*)inSVar { 

if (self->sVar != inSVar){ 

[self->sVar release]; 

self->sVar = [inSVar retain]; 

Trang 10

retain: retain nên được triệu gọi trên đối tượng được chỉ định

copy: một bản sao của đối tượng sẽ được sử dụng cho đối tượng chỉ định

Ta có thể hình dung như sau

PHP Code:

@property (readwrite, copy) NSString *sVar;  

Properties này tương tự như settor sau

PHP Code:

-(void)setSVar:(NSString*)inSVar { 

if (self->sVar != inSVar){ 

[self->sVar release]; 

self->sVar = [inSVar copy]; 

}  

Ta sử dụng chỉ định copy khi mà có khả năng tham số sVar là đối tượng có thể thay đổi Những ràng buộc phụ thuộc vào việc bạn chọn sử dụng hoặc không sử dụng bộ thu gom rác Nếu bạn không sử dụng bộ thu gom rác, với Properties của đối tượng bạn phải chỉ rõ assign, retain hay copy, nếu không trình biên dịch sẽ cảnh báo

Nếu bạn sử dụng bộ thu gom rác, bạn sẽ không bị cảnh báo nếu không chỉ định assign, retain hay copy (mặc định khi đó là assign), trừ khi kiểu của Properties là một lớp thích hợp với NSCopying Để mặc định thường là những gì bạn muốn, tuy nhiên, nếu đối tượng có thể sao chép thì để bảo tồn tính bao đóng bạn thường muốn làm một bản sao chép riêng cho đối tượng.

Nếu bạn sử dụng bộ thu gom rác thì assign và retain có hiệu lực như nhau

Atomicity: thuộc tính này chỉ ra Properties là không atomicity với từ khóa nonatomic Việc này tương tự như đồng bộ hóa trong khái niệm Thread, Properties này sẽ bị block và thực hiện đồng bộ Mặc định là atomic.

1.2 Category

Khi ta muốn thêm một số phương thức vào một lớp có sẵn, thông thường ta sẽ mở rộng lớp

đó bằng cách viết lại mã nguồn Objective-C cung cấp tính năng Category cho phép ta mở rộng lớp mà không cần phải viết lại mã nguồn của lớp cũ Category cho phép ta mở rộng lớp

cũ trong một bộ thực thi khác

Trang 11

Giả sử ta có một lớp MyClass đã định nghĩa

MyClass.h

PHP Code:

-(void) print; 

@end  

MyClass.m

PHP Code:

#import “MyClass.h” 

@implementation MyClass 

-(void) print { 

//to do print 

}  

Ta muốn thêm một một phương thức newMethod, ta sử dụng tính năng Category của Objective-C như sau

MyCategory.h

PHP Code:

#import “MyClass.h” 

-(void) newMethod; 

@end  

MyCategory.m

PHP Code:

#import “MyCategory.h” 

@implementation MyClass (MyNewCategory) 

-(void) newMethod { 

Trang 12

}  

Sử dụng như sau

PHP Code:

#import “MyClass.h” 

#import “MyCategory.h” 

  

int main(int argc, const char *argv) { 

MyClass *myObject = [[MyClass alloc] init]; 

[myObject print]; 

[myObject newMethod]; 

}  

Tên của Category là duy nhất, có thể thêm nhiều Category nhưng không được trùng tên Trong Category không cho phép thêm các biến thể hiện

Ngoài mục đích mở rộng, Category thường được sử dụng để “định nghĩa” các phương thức

“private” (không được hỗ trợ trong Objective-C)

PHP Code:

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

// = File: SomeClass.m 

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

#import “SomeClass.h” 

  

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

// = Interface for hidden methods 

Trang 13

@interface SomeClass (hidden) 

  

+(void) hiddenClassMethod; 

-(void) hiddenInstanceMethod; 

  

@end  

PHP Code:

// =====================================  // = Implementation of hidden methods  // ===================================== 

@implementation SomeClass (hidden) 

  

+(void) hiddenClassMethod { 

printf( “Hidden class method.n” ); 

  

-(void) hiddenInstanceMethod { 

printf( “Hidden instance methodn” ); 

  

@end  

PHP Code:

// ================================  // = Implementation for SomeClass 

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

@implementation SomeClass 

Trang 14

-(void) msg { 

printf(“Inside msg()…n”); 

  

[self hiddenInstanceMethod]; 

[SomeClass hiddenClassMethod]; 

  

+(void) classMsg { 

printf(“Inside classMsg()…n”); 

  

@end  

Khi đó, ta sử dụng lớp SomeClass với phương thức msg() mà không biết đến các phương thức

“hidden” như là các phương thức private

PHP Code:

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

// = File: Main.m 

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

#import “SomeClass.h” 

  

int main (int argc, char *argv[]){ 

SomeClass *ptr = [[SomeClass alloc] init]; 

  

// Display message (including messages from hidden methods) 

Trang 15

  

// Call a class method 

[SomeClass classMsg]; 

  

}  

1.3 Posing

Pose là một tính năng của Objective-C cho phép lớp con thay thế (pose – in place of) lớp cha

mà nó kế thừa trong một ngữ cảnh nhất định

PHP Code:

-(void) print; 

@end  

PHP Code:

#import “Fraction.h” 

  

@implementation Fraction 

-(void) print { 

printf( “printf of Fraction”); 

@end  

PHP Code:

#import “Fraction.h” 

Trang 16

@end  

PHP Code:

#import “FractionA.h” 

  

@implementation FractionA 

-(void) print { 

printf( “new printf of FractionA”); 

@end  

PHP Code:

#import “Fraction.h” 

#import “FractionB.h” 

  

int main( int argc, const char *argv[] ) { 

Fraction *frac = [[Fraction alloc] init]; 

  

// print it 

printf( “The fraction is: ” ); 

[frac print]; 

printf( “n” ); 

  

// FractionA pose as Fraction 

[FractionA poseAsClass: [Fraction class]]; 

  

Fraction *frac2 = [[Fraction alloc] init]; 

Trang 17

// print it 

printf( “The fraction is: ” ); 

[frac2 print]; 

printf( “n” ); 

  

// free memory 

[frac release]; 

[frac2 release]; 

  

}  

Kết quả là

The fraction is: printf of Fraction

The fraction is: new printf of FractionA

Phương thức poseAsClass là một phần của protocol NSObject

1.4 Protocol

Protocol định nghĩa một danh sách các phương thức bắt buộc hoặc tùy chọn mà các lớp chấp nhận (adopt) protocol bắt buộc phải thực thi.

PHP Code:

@protocol MyProtocol 

  

- (void)requiredMethod; 

  

Trang 18

  

- (void)anOptionalMethod; 

  

- (void)anotherOptionalMethod; 

  

@required 

  

- (void)anotherRequiredMethod; 

  

@end  

Các phương thức khai báo trong Protocol cũng có thể là các khai báo Properties Các từ khóa

@optional và @required thể hiện theo đúng ý nghĩa của nó, nếu không sử dụng 2 từ khóa này thì mặc định là @required

PHP Code:

@protocol NSCoding 

- (void)encodeWithCoder:(NSCoder *)aCoder; 

- (id)initWithCoder:(NSCoder *)aDecoder; 

@end  

PHP Code:

// Interface 

@interface SomeClass : NSObject <NSCoding> { 

… 

}  

PHP Code:

// Implementation 

@implementation SomeClass 

Trang 19

-(void)encodeWithCoder:(NSCoder *)aCoder{ 

… 

  

-(id)initWithCoder:(NSCoder *)aDecoder{ 

… 

}  

SomeClass triển khai Protocol NSCoding theo cú pháp <Protocol>

@interface ClassName : ItsSuperclass < protocol list >

@interface ClassName ( CategoryName ) < protocol list >

Ví dụ:

PHP Code:

@interface Formatter : NSObject < Formatting, Prettifying >  

Protocol được sử dụng trong các trường hợp:

- Khai báo các phương thức dự kiến sẽ được thực thi

- Khai báo một interface cho một đối tượng trong khi ẩn đi lớp của nó

- Khảo sát tương đồng giữa các lớp mà không phải liên quan đến cấu trúc thứ bậc

Ngày đăng: 23/02/2013, 09:29

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w