Hiển thị các bài đăng có nhãn xcode; ios; objective-c. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn xcode; ios; objective-c. Hiển thị tất cả bài đăng

Thứ Tư, 25 tháng 9, 2013

Ngôn ngữ máy cho iPhone phổ biến thứ ba trên thế giới

Objective-C C++ biến thể bắt nguồn từ C - ngôn ngữ lập trình phổ quát theo bảng xếp hạng TIOBE Index , tiếp đến là Java. Apple chọn objective-c hệ điều hành NeXT STEP Steve Jobs công ty NeXT của ông phát triển vào thập niên 80 thế kỷ trước rồi đây trở thành cơ sở cho nền móng Mac OS X , iOS , objective-c tutorial xcode viết hai chuyên gia Brad Cox Tom Love thuộc công ty Stepstone từ cách 30 năm. Dù App Store căn nguyên cho phổ quát củaobjective-c tutorial xcode , chuyên gia đánh giá ngôn ngữ dễ sử dụng nhiều ngôn ngữ khác , giúp có khả năng tự tìm hiểu , tiếp cận học hỏi.
Objective-C và C++ đều là biến thể bắt nguồn từ C - ngôn ngữ lập trình phổ quát nhất theo bảng xếp hạng TIOBE Index , tiếp đến là Java. Điều đáng nói là mới chỉ cách đây một năm , objective-c xếp hạng thứ 46
An Ultra-Compressed Objective-C 2.0 Walkthrough | Ole Weidner
,  "Thành tích này không phải nhờ bản thânobjective-c tutorial pdf mà nhờ hệ sinh thái Apple" , Nolan Wright , chuyên gia công nghệ tại Appcelerator , nhận định trên Wired
Top 5 Features of The New iPhone 5 | Propel Marketing Blog
-  "Nếu Apple dùng một ngôn ngữ khác , nó cũng sẽ có vị trí cao như vậy". objective-c tutorial for non-programmers ( xanh da hoàng thiên ) tăng đột biến từ giữa năm 2009. Apple lựa objective-c là gì vì đó là ngôn ngữ trong hệ điều hành NeXT STEP do chính Steve Jobs cùng công ty NeXT của ông phát triển vào thập niên 80 của thế kỷ trước và rồi đây trở thành cơ sở cho các nền móng Mac OS X , iOS. objective-c tutorial xcode được viết bởi hai chuyên gia Brad Cox và Tom Love thuộc công ty Stepstone từ cách đây hơn 30 năm. Nó hiếm khi xuất hiện trong bảng xếp hạng TIOBE cho tới mùa hè năm 2008 khi Apple giới thiệu kho áp dụng App Store. Đến nay , objective-c la gi đã có mặt trong 9 , 3% phần mềm toàn cầu trong lúc C++ là 9 , 1%. ( Một khảo sát khác của Transparent Language Index cũng đưa ra số liệu là objective-c tutorial pdf đạt 9 , 2% còn C++ chỉ có 7 , 9% ). Dù App Store là căn nguyên chính cho sự phổ quát củaobjective-c tutorial xcode , các chuyên gia đánh giá ngôn ngữ này cũng dễ sử dụng hơn nhiều ngôn ngữ khác , giúp ai cũng có khả năng tự tìm hiểu , tiếp cận và học hỏi. Bởi thế , không ít em mới là học sinh tiểu học đã có khả năng viết áp dụng cho iPhone. Châu An. objective-c tutorial video ( xanh da hoàng thiên ) tăng đột biến từ giữa năm 2009.

Thứ Hai, 1 tháng 7, 2013

LẬP TRÌNH OBJECTIVE-C - part 5

7.     Quản lý bộ nhớ, ARC (Automactic Reference Counting)

-          Quản lý bộ nhớ là quản lý việc khởi tạo vùng nhớ cho ứng dụng, sử dụng nó và giải phóng nó khi ta đã hoàn thành công việc. Một chương trình quản lý bộ nhớ tốt sẽ sử dụng ít vùng nhớ nhất có thể.
 -          Manual Reference Counting (MRC) : quản lý bộ nhớ thủ công, có nghĩa là chúng ta sẽ tự quản lý bộ nhớ bằng cách đánh dấu, theo vết vòng đời của object. Cụ thể là ta sẽ đếm việc khởi tạo, sử dụng và giải phóng object trong chương trình.
-          Autiomatic Reference Counting (ARC) : quản lý bộ nhớ tự động, hệ thống sẽ dùng bộ đếm tương tự như MRC nhưng nó sẽ thêm vào phương thức quản lý bộ nhớ tự động tại thời điểm compile.
-          Garbage Collection (GC) : hệ thống sẽ tự động lưu vết và tự động giải phóng vùng nhớ của object không cần thiết nữa. Nó sử dụng kỹ thuật quản lý bộ nhớ khác với MRC và ARC, tuy nhiên GC chỉ hỗ trợ Mac OS X mà không hỗ trợ iOS.

l  Reference Counting
-          Reference Counting(hoặc Retain Counting) : là một kỹ thuật quản lý bộ nhớ của Objective-C nhằm theo vết vòng đời của đối tượng(object), đếm số lượng tham chiếu đến một đối tượng.
-          Reference Count(hoặc Retain Count) : số lượng tham chiếu đến một đối tượng.
-          Khi đối tượng được khởi tạo bằng các từ khóa như allocnewcopy  thì reference count của nó sẽ tự động là 1.
-          Để tăng reference count lên 1, ta gửi thông điệp retain cho đối tượng.
-          Để giảm reference count xuống 1, ta gửi thông điệp release cho đối tượng.
-          Để có thể biết được reference count hiện tại, ta gửi thông điệp retainCount cho đối tượng.
-          Khi reference count giảm xuống 0 thì đối tượng sẽ được hủy, vùng nhớ được giải phóng, lúc này hệ thống sẽ tự động gửi thông điệp dealloc cho đối tượng. 

l  Ví dụ:
-          alloc hoặc new  
Mục đích : 
Cấp phát bộ nhớ cho đối tượng.
Reference count : bằng 1
Ví dụ:
NSString *str = [[NSString alloc] init];
NSString *str = [NSString new];

-          copy
Mục đích : 
Cấp phát bộ nhớ cho đối tượng thông qua một đối tượng khác.
Reference count : bằng 1
Ví dụ:
NSString *str = [someString copy];
NSString *str = [someString copy];

-          retain  
Mục đích : 
Gọi khi ta cần sử dụng một đối tượng, mà đối tượng đó đã được cấp phát ở đâu đó, ta không chắc là tại thời điểm ta sử dụng thì đối tượng đó có bị release hay không. Gọi retain giống như ta thông báo cho chủ sở hữu của nó là “Đừng xóa nó cho đến khi tôi sử dụng nó xong nhé !”. Khi gọi retain thì lúc này chúng ta là chủ sở hữu mới của nó(bên cạnh chủ sở hữu cũ). Khi nào sử dụng xong ta cần phải release nó.
Reference count : tăng thêm 1
Ví dụ:
NSString *str = [[NSString alloc] initWithString:@”Hello”];
NSString *str2 = str;
[str release];
//Sau vài giây thì str2 không còn lưu đúng nội dung

Trong ví dụ trên, biến str2 chỉ đơn giản là trỏ đến vùng nhớ của biến str, một khi ta giải phóng biến str thì biến str2 sẽ lưu không còn đúng nội dung nữa. Giải pháp :
NSString *str = [[NSString alloc] initWithString:@”Hello”];
NSString *str2 = [str retain];
[str release];
//str2 vẫn còn lưu đúng nội dung cho tới khi ta giải phóng nó
[str2 release];

-          release
Mục đích
Báo cho hệ thống biết là ta đã sử dụng xong 1 đối tượng nào đó và cần giải phóng nó. Đối tượng sẽ thực sự được giải phóng chỉ khi không còn ai sở hữu nó nữa (reference count = 0)
Reference count : Giảm xuống 1 ngay lập tức.

-          autorelease  
Mục đích
- Khi ta không muốn giải phóng một đối tượng nào đó ngay lập tức.
- Khi ta không muốn phải ghi nhớ lúc nào nên release những đối tượng mà ta đã cấp phát khi sử dụng xong.

- Khi ta muốn thêm một đối tượng vào autorelease pool.
Reference count : Giảm xuống 1 nhưng không ngay lập tức.

-          Convenience methods
Khái niệm :
Là những phương thức static, dùng để cấp phát và khởi tạo đối tượng một cách trực tiếp. Đối tượng được tạo ra từ phương thức convenience gọi là autorelease object, và ta không sở hữu đối tượng này.
NSString *str2 = [NSString stringWithFormat:@”%d”, 4]; 

- Tất cả các autorelease objects  được tạo ra sẽ được thêm vào autorelease pool  hiện tại.

-          Autorelease Pool  
Khái niệm : 
Là nơi chứa và giải phóng các autorelease objects . Khi autorelease pool  được giải phóng (thường là hết vòng lặp hay kết thúc hàm) thì các object nằm bên trong nó cũng sẽ được tự động giải phóng.

Khi nào nên sử dụng : 
- Khi ta muốn tự hủy một loạt các autorelease objects.
- Trong trường hợp cụ thể khi ta sử dụng nhiều biến tạm và muốn tránh phải cấp phát và release tất cả những biến này khi sử dụng xong.
- Hoặc ta không muốn đợi autorelease pool  của hệ thống được giải phóng, ta sẽ sử dụng đối tượng thuộc lớp NSAutoreleasePool

NSString *str2 = [NSString stringWithFormat:@”%d”, 4]; 
for (int i = 0; i <= 99999; i++)  {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *str1 = [NSString stringWithFormat:@”%d”, i];
NSString *str2 = [NSString stringWithFormat:@”%d”, i];
//...
}
[pool release];//Các autorelease objects ở trên sẽ đc giải phóng
}

Như ví dụ trên đây, nếu như ta không dùng lớp NSAutoreleasePool  thì khi chạy hết 99999 vòng lặp, cácautorelease objects  nằm trong autorelease pool  mới được giải phóng, và điều đó sẽ gây ra hiện tượng tràn bộ nhớ.

-          Hệ quả từ Autorelease Pool
Khi trong hàm ta sử dụng nhiều biến được cấp phát, và không muốn suy nghĩ lúc nào nên release biến này, lúc nào nên release biến kia, ta chỉ cần kẹp đoạn code giữa NSAutoreleasePool , rồi cho biến đó autorelease, sau đó ta vẫn sử dụng nó được bình thường.

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Animal *animal = [[Animal alloc] initWithName:@"Animal"];
[animal autorelease];
Zoo *zoo = [[Zoo alloc] init];
[zoo autorelease];
[zoo add:animal];
[pool release];
tài liệu tham khảo

Thứ Sáu, 28 tháng 6, 2013

LẬP TRÌNH OBJECTIVE-C - part 4

5.     Categories, Protocols, Delegate

a. Categories
-       Là đặc điểm nếu bạn muốn mở rộng lớp bằng cách thêm mới vào lớp một phương thức. Khi bạn làm việc quen với OOP thì bạn sẽ thấy đây là một trong những thuộc tính vô cùng hữu ích của Objective C, kể cả ngay khi bạn không có mã nguồn của lớp nhưng bạn vẫn hoàn toàn có thể thêm phương thức cho lớp như thường thông qua thuộc tính này. Đặc điểm này làm giảm đi đáng kể sự kế thừa phức tạp trong C++ khi việc kế thừa chỉ để phục vụ cho việc thêm mới một phương thức. Mặt khăc việc chia mã nguồn trên nhiều files cũng giúp ích đáng kể trong việc phát triển.
-       Tên của category phải là duy nhất
-       Có thể thêm bao nhiêu lần mở rộng lơp từ category là không giới hạn nhưng với tên là duy nhất.
-       Thông thể bổ xung biến thành phần bằng category.
-       Có thể sử dụng category để tạo ra các phương thức private. Nếu cần.
-       Cú pháp:
@interface ClassToAddMethodsTo (category)
//methods go here
@end

-       Ví dụ như :
@interface NSString (reverse)
-(NSString *) reverseString;
@end
 
@implementation NSString (reverse)
-(NSString *) reverseString {
  NSMutableString *reversedStr;
  int len = [self length];
  // Auto released string
  reversedStr = [NSMutableString stringWithCapacity:len];    
  // Probably woefully inefficient...
  while (len > 0)
    [reversedStr appendString:
         [NSString stringWithFormat:@"%C", [self characterAtIndex:--len]]];  
  return reversedStr;
}
@end

#import <Foundation/Foundation.h>
#import "NSString+Reverse.h"
int main (int argc, const char * argv[]) {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  NSString *str  = [NSString stringWithString:@"Fubar"];
  NSString *rev;
  NSLog(@"String: %@", str);
  rev = [str reverseString];
  NSLog(@"Reversed: %@",rev);
  [pool drain];
  return 0;
}
Kết quả :

b. Frotocols (giao thức)
-          Objective-C cho phép bạn xác định các giao thức, thực hiện các kê khai các method dự kiến sẽ được sử dụng cho một tình huống cụ thể.
-          Một lớp giao diện khai báo cáo các hàm (methods) và các thuộc tính (proproties) thì gắn liền với lớp đó. Còn với một giao thức, thì ngược lại sử dụng để khai báo các method và properties độc lập với bất lớp nào khác.
-          Tất cả các class trong giao thức đều là required methods.
-          Cú pháp :
@protocol ProtocolName
// list of methods and properties
@end

-          Giao thức bao gồm cả method, thuộc tính

-          Ví dụ trên developer.apple.com
Đây là về biểu đồ hình tròn: gồm 3 thuộc tính :
@protocol XYZPieChartViewDataSource
- (NSUInteger)numberOfSegments;
- (CGFloat)sizeOfSegmentAtIndex:(NSUInteger)segmentIndex;
@optional
- (NSString *)titleForSegmentAtIndex:(NSUInteger)segmentIndex;
- (BOOL)shouldExplodeSegmentAtIndex:(NSUInteger)segmentIndex;
@required
- (UIColor *)colorForSegmentAtIndex:(NSUInteger)segmentIndex;
@end
   
      Gọi giao thức
@interface XYZPieChartView : UIView
@property (weak) id <XYZPieChartViewDataSource> dataSource;
@end

-          ́ thừa từ các giao thức khác :
@protocol MyProtocol <NSObject>
...
@end

@interface MyClass : NSObject <MyProtocol, AnotherProtocol, YetAnotherProtocol>
...