Phương pháp khai báo hàm trong Objective-C

13:15:22 - 29/05/2016 - admin

Hướng dẫn phương thức cách gọi và những phương pháp khai báo hàm trong Objective-C dưới đây sẽ giúp các bạn hiểu hơn về ngôn ngữ lập trình này trước khi đình học khóa học ios.

Phương thức và cách gọi
Cú pháp khai báo hàm
-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
1
-(kiểu dữ liệu)tên hàm:(kiểu dữ liệu)tham số 1 <tên tham số>:(kiểu dữ liệu)tham số 2;
Như đã nói, Obj-C có cách gọi phương thức (gọi hàm) của ngôn ngữ Smalltalk) cho nên trông nó khác hẳn C,C++ hay Java. Để đơn giản bạn đối chiếu hai ngôn ngữ Java và Obj-C
//Java
displayNames();
displayNamesWithPrefix( prefix );
addressBook.displayNames();
addressBook.displayNamesWithPrefix( prefix );
//Obj-C
[addressBook displayNames];
[addressBook displayNamesWithPrefix: prefix];
Tức là cú pháp
[object method];
[object methodWithInput: inputValue];
đối với hàm trả về giá trị thì..
names = [addressBook names];
names = [addressBook namesWithPrefix:prefix];

Xem thêm: Khóa học lap trinh game unity cơ bản

Khởi tạo đối tượng:
Lớp NSString:
Đây là một lớp dữ liệu trường đc sử dụng trong các chương trình obj-C, nó tương tự kiểu chuỗi trong các ngôn ngữ C++,Java, PHP…
ví dụ: NSString *blogname = @”Xcode Blog chấm com”;
Khởi tạo đối tượng
Trong C++, Java khái niệm này trương tự “Constructor”. Nghĩ là cấp phát mới vùng nhớ cho đối tượng và init các thuộc tính của đối tượng đó.
NSString* myString = [NSString string];
Obj-C chia làm hai loại khởi tạo:
Autorelase: đối tượng được khởi tạo dạng này thì bộ nhớ của chúng sẽ được quản lý 1 tự động. Tức là hệ thống sẽ tự thu hồi vùng nhớ của đối tượng khi nó không được dùng nữa.
ví dụ:
NSString* myString = [NSString string];
Manualrelase: Các biến này cần phải được quản vùng nhớ bởi “chính bạn”. Tức là phải gọi hàm destroy (trong Obj-C nó là hàm release) khi mà đối tượng không còn được dùng nữa.
ví dụ:
NSString* myString = [[NSString alloc] init];
Xây dựng lớp: Declaring a Class
Thông thường trong Obj-C class được xây dựng trên 2 file .h (header file) và .m (implement file). Header file chứa phần interface của class, implement file chứa phần implementation của các phương thức.
Tên file đặt theo tên class ví dụ lớp “ClassName” sẽ có 2 file ClassName.h và ClassName.m
Class interface
xem ví dụ:
#import <Cocoa/Cocoa.h>
@interface Photo : NSObject {
id caption;
id photographer;
}
@end
Line #1: giống với included của C, C++ hay import của Java
Line #2: Khai báo lớp Photo, thừa kế từ lớp NSObject. (NSObject là lớp “tổ tiên” trong Obj-C mọi lớp khác đều thừa kế từ nó).
Line #3,#4: khai báo 2 đối tượng con trỏ kiểu “id” (id là từ khóa, con trỏ có thể trỏ đến mọi đối tượng).
Khai báo phương thức:
Có hai loại phương thức:
Phương thức lớp (Class Method): phương thức này được gọi thông qua tên lớp được khai báo với dấu +
+ (kiểu dữ liệu)tên phương thức :(kiểu dữ liệu) tên tham số thứ nhất…
Phương thức đối tượng: được gọi qua tên đối tượng
– (kiểu dữ liệu)tên phương thức :(kiểu dữ liệu) tên tham số thứ nhất…
#import <Cocoa/Cocoa.h>
@interface Photo : NSObject {
NSString* caption;
NSString* photographer;
}
– (NSString*) caption;
– (NSString*) photographer;
– (void) setCaption: (NSString*)input;
– (void) setPhotographer: (NSString*)input;
@end
Cài đặt/hiện thực lớp : Implement Class
#import “Photo.h”
@implementation Photo
– (NSString*) caption {
return caption;
}
– (NSString*) photographer {
return photographer;
}
– (void) setCaption: (NSString*)input {

ngon-ngu-lap-trinh-object

Quản lý bộ nhớ – Memory Management

Mình chỉ xét đến trường hợp project/file ở dạng nonARC thôi nhé, tức là những phương thức quản lý này chỉ áp dụng cho project hoặc file không hỗ trợ ARC (Automatic Reference Counting) thôi. Khi nào viết bài về ARC mình sẽ nói về cách quản lý vùng nhớ của các project file dạng đó.
Release
Cơ bản nhất của quản lý bộ nhớ là: biến nào mà bạn khởi tạo bằng method aloc thì khi nào kô dùng biến đó nữa bạn phải gọi hàm release.
ví dụ:
NSString *stringA = [[NSString alloc] initWithString:@”http://xcodeblog.com”];
NSString *stringB = [NSString string];
//bạn phải release stringA
[stringA release];
Nếu bạn copy 1 đối tượng thì đối tượng copy phải đc relase khi không dùng đến nữa.
NSString *stringA = [[NSString alloc] initWithString:@”http://xcodeblog.com”];
NSString *stringB = [stringA copy];
//bạn phải release stringA và stringB
[stringA release];
[stringB release];

Retain
Obj-C sử dụng một biết đếm “retainCount” để quản lý các tham chiếu đến chính đối tượng đó. Các phương thức alloc, new, copy sẽ tăng biến này lên 1, phương thức release sẽ giảm xuống 1.
Khi retainCount của đối tượng có giá trị là 0 lúc đó đối tượng sẽ bị dealloc (tự hủy). Do đó khi đối tượng được dùng trong một phương thức của đối tượng khác chúng ta cần gọi retain để tăng retain count của đối tượng lên 1 dĩ nhiên phải giảm nó 1 khi không dùng nữa.
Ý nghĩa của retain là đảm bảo cho đối tượng đc retain không bị hủy trong khi nó đang bị trưng dụng bởi đối tường khác.
– (void) setTotalAmount: (NSNumber*)input {
[totalAmount autorelease];
totalAmount = [input retain];
}

Dealloc
Đây là phương thức hủy của đối tượng, bạn phải gọi release các đối tượng khác mà đối tườn của bạn đang dùng.
Property và các option
Đây là 1 đặc tính của Obj-C cho phép tự động tạo ra các phương thúc setter và getter
ví dụ thay vì định nghĩa lớp như code sau đây
#import <Cocoa/Cocoa.h>
@interface Photo : NSObject {
NSString* caption;
NSString* photographer;
}
+ (Photo*) photo;
– (NSString*) caption;
– (NSString*) photographer;
– (void) setCaption: (NSString*)input;
– (void) setPhotographer: (NSString*)input;
@end
ta có thể dùng code sau
#import <Cocoa/Cocoa.h>
@interface Photo : NSObject {
NSString* caption;
NSString* photographer;
}
+ (Photo*) photo;
@property (retain) NSString* caption; @property (retain) NSString* photographer;
@end

Các Options
readwrite(mặc định): cho phép đọc và ghi(get/set)
read-only: chỉ có thể đọc (get)
assign(mặc định) dùng với các kiểu vô hướng: NSString, NSInteger, CGFloat…
retain: thường được sử dụng cho đối tượng
copy: tạo một bản sao lưu của đối tượng
attomic (mặc định) thực hiện đồng bộ hoá
nonattomic: ngược lại với attomic
Category
Objective-C không có đa thừa kế như Java nghĩa là bạn không thể tạo 1 lớp mới thừa kế 1 lúc nhiều lớp khác. Nhưng bạn có thể mở rộng một lớp nào đó bất kỳ. Khái niệm này là Category, bạn có thể thêm vào 1 lớp nào đó các phương thức, biến..
@interface NSString (Utilities)
– (BOOL) isXcodeBlogUrl;
@end
@implementation NSString (Utilities)
– (BOOL) isURL {
if ( [self hasPrefix:@”http://xcodeblog.com”] )
return YES;
else
return NO;
}

Protocol
Đây là một đặc điểm tuyệt vời của Objectice-C, cho phép các lớp/đối tượng khác biệt (không thừa kế) nhau có thể sử dụng phương thức ủa nhau mà không cần phải thừa kế
Đây là một ví dụ trong đó mình sử dụng pro tocol của lớp UITableView trong lớp UIViewController :
Load json feed lên UITableView sử dụng AFNetworking
Khái niệm này nói thì khó và dài dòng nhưng, sử dụng thì rất dễ và hiệu quả. Ý nghĩa của nó là cho phép bạn implement các phương thức của một lớp (phương thức này thuộc protocol) trong phần implement của một lớp khác.
@protocol IconViewInfo <NSObject>
– (NSString*) title;
– (NSString*) fileName; – (NSString*) summary;
@optional
– (NSString*) author;
– (id) previewData; @end
Từ khóa @optional ( mặc định) nghĩa là cái protocol methods này không bawtsc buộc phải implement trong lớp “thừa kế” protocol.
@interface Photo : Media <IconViewInfo>
@property (copy) NSString* caption;
@property (copy) NSString* photographer;
@end
Các methods của protocol IconViewInfo sẽ đc implement trong phần thân của class Photo
@implementation Photo
@synthesize caption; @synthesize photographer;
-(NSString *) title {
return self.caption; }
-(NSString *) fileName {
return [self.caption stringByAppendingPathExtension:@”jpg”]; }
-(NSString *) summary {
return [NSString stringWithFormat:
}
} @end
Mình sẽ nói rõ hơn khi gặp vấn đề liên quan, chú ý rằng đây là một đặc điểm dùng nhiều trong ứng dụng iOS/Mac OS nên bạn “phải” hiểu nó.
Thông điệp động Dynamic Message
Như đã nói Obj-C là ngôn ngữ động – mềm mại – uyển chuyển. Và đây là đặc điểm đó, Obj-C bạn có thể lưu giữ tên hàm như 1 biến và truyền chúng giữa các đối tượng khác nhau . Phương thức này là “selector” và kiểu dữ liệu của nó là “SEL”
SEL homeSelector = @selector( loadHomeScreen: );
NSString* selectorName = @”loadPreviewScreen:”;
SEL previewSelector = NSSelectorFromString( selectorName );
//multiple inputs
SEL compareSelector = @selector(compare:options:range:);
ví dụ về cách sử dụng
@interface Photo : NSObject
– (NSString*) caption;
– (void) setAlbum:(Album*)album;
@end
@interface Album : NSObject + (id) defaultAlbum;
@end
Photo* myPhoto = [[Photo alloc] init]; Album* myAlbum = [[Album alloc] init];
SEL captionSelector = @selector( caption );
SEL albumSelector = @selector( setAlbum: );
SEL unknownSelector = @selector( yeahThisMethodDoesntActuallyExist );
if ([myPhoto respondsToSelector: captionSelector]) {
NSLog (@”Calling ‘%@’”, NSStringFromSelector( captionSelector ));
NSString* caption = [myPhoto performSelector:captionSelector];
NSLog (@”Photo caption: ‘%@’”, caption);
}
if ([myPhoto respondsToSelector: albumSelector]) {
NSLog (@”Calling ‘%@’”, NSStringFromSelector( albumSelector ));
[myPhoto performSelector:albumSelector withObject:myAlbum]; }
if ([myPhoto respondsToSelector: unknownSelector]) {
NSLog (@”Calling ‘%@’”, NSStringFromSelector( unknownSelector ));
[myPhoto performSelector:unknownSelector];
}
[myPhoto release]; [myAlbum release];

Ngoại Lệ : Exceptions
Tương tự C++ hay Java  bạn chỉ cần xem qua ví dụ là hiểu
NSString* myString = [[NSString alloc] init];
@try {
char firstChar = [myString characterAtIndex:0]; int length = [myString length];
NSLog( @”Length is: %i”, length );
}
@catch (NSException * e) {
NSLog( @”Caught an NSException, returning.” ); NSLog( @”Name: %@”, e.name );
NSLog( @”Reason: %@”, e.reason );
return;
}
@finally {
// will still get called, even if above returns. NSLog( @”Releasing string.”);
[myString release];
}

Gợi ý xem thêm: Tìm hiểu khoa hoc lap trinh android

Nguồn từ: Ngôn ngữ lập trình Objective-C là gì?

Tags:

Ý kiến bạn đọc

Bình luận qua Disqus Facebook