Showing posts with label iPhone. Show all posts
Showing posts with label iPhone. Show all posts

Friday, October 16, 2015

Lập trình iOS: Bài 4 - UINavigationViewController và ứng dụng Multiple ViewController

Ở bài viết này chúng ta sẽ tìm hiểu về UINavigationController và ứng dụng Multiple ViewController tức là có hơn 1 ViewController mà ở bài 3 chúng ta đã tìm hiểu.
Yêu cầu ở bài 4 này, chúng ta đã làm quen và có thể thao tác được với việc tạo các đối tượng UIView khác như UILabel, UIButton,... và add vào View của một ViewController, biết các liên kết Outlet, Action, những việc mà chúng ta đã tìm hiểu qua ở bài 3.

Thursday, October 15, 2015

Lập trình iOS: Bài 3 - Ứng dụng đầu tiên, tìm hiểu về UIWindow, UIView và UIViewController

Đã lâu không có thời gian post bài, hôm nay mình tranh thủ cùng các bạn tìm hiểu tiếp lập trình iOS với ứng dụng đầu tiên.
Hiện tại mình đang sử dụng Xcode 7.0.1, iOS 9.0
Ở bài 3 này, chúng ta sẽ tìm hiểu để nắm rõ hơn về UIWindow, UIView và UIWiewController, những khái niệm mà theo mình thì cách đây vài năm, với các phiên bản trước của Xcode sẽ giúp chúng ta hiểu sâu hơn, ở các bản mới sau này, mọi thứ gần như Apple đã giúp chúng ta làm hết cả.

Thursday, July 30, 2015

Lập trình iOS: Lỗi không thể Submit App sau khi Archive trên Xcode

Vừa rồi build một số ứng dụng để Submit lên AppStore mình gặp phải lỗi rất khó chịu, đó là sau khi Archive dự án thì không thể Submit app lên được


Thursday, April 16, 2015

Lập trình iOS: Bài 2 – Ngôn ngữ lập trình Objective C


Ở bài này chúng ta cùng tìm hiểu về Ngôn ngữ lập trình Objective C, ngôn ngữ được sử dụng để lập trình iOS.
Ở phần này mình giả sử các bạn được có “môi trường làm việc” MAC OS, đã cài đặt IDE Xcode.
Chúng ta sẽ chưa bắt tay vào lập trình nên các ứng dụng iOS, mà ở bài viết này chúng ta sẽ tìm hiểu về Objective C, các kiểu dữ liệu, cú pháp câu lệnh, hướng đối tượng,…

Lập trình iOS: Bài 1 – Bắt đầu với Lập trình iPhone


Ngày nay với việc công nghệ Mobile đang phát triển ngày càng mạnh mẽ, việc học lập trình ứng dụng trên di động có lẽ trở nên dễ dàng hơn bao giờ hết với các công nghệ Mobile như iOS, Android, Window Phone,… Tuy nói là vậy, nhưng việc bắt đầu một thứ mới bao giờ cũng có một số các khó khăn nhất định, nhất là đối với việc học lập trình cho các bạn lập trình viên mới cũng như các bạn sinh viên. Do vậy, hôm nay mình quyết định viết một loạt bài viết cơ bản về Lập trình iOS nhằm mục đích giúp các bạn mới có được cái nhìn ban đầu về Lập trình iOS, rồi từ đó có thể tự mình nâng cao khả năng hơn.


Tuesday, March 24, 2015

[My Games] Game Kolor Shot

Mấy hôm nay rãnh rỗi nên quyết định làm 1 game dựa theo ý tưởng Impossible Rush.
Game mình làm là Kolor Shot.
Game được xây dựng bằng Cocos2-dx và Cocostudio trong 2 ngày, game được build trên 2 nền tảng là iPhone và Android.

https://play.google.com/store/apps/details?id=studio.kensai.KolorShot

Link tải game:
. Google Play: https://play.google.com/store/apps/details?id=studio.kensai.KolorShot
. App Store: https://itunes.apple.com/us/app/kolor-shot/id976055131?ls=1&mt=8

Wednesday, March 11, 2015

Cocos2d-x: Tích hợp quảng cáo Admob vào Game (Phần 1)


Hôm nay chúng ta sẽ cùng tìm hiểu về chủ đề "Tích hợp quảng cáo Admob vào Game".
Ngày nay, đại đa số các bạn làm game đều chủ yếu là phát triển các game Free, sau đó gắn quảng cáo dưới dạng Banner hoặc là Interstitial (Full screen).
Vì quảng cáo Admob của Google không có thư viện riêng cho C++ nói chung hay Cocos2d-x nói riêng, nên chúng ta sẽ tiếp cận việc tích hợp này theo hướng Native Code, tức là tích hợp theo từng nền tảng.
Do đó bài viết này sẽ có 2 phần:
- Phần 1: tích hợp Admob trên nền tảng iOS
- Phần 2: tích hợp Admob trên nền tảng Android.

Giả sử đến giai đoạn này chúng ta đã xây dựng xong được một game theo ý của mình, và chúng ta muốn tích hợp quảng cáo vào game. Chúng ta sẽ đi qua các bước như sau:
1. Tạo thông tin game trong tài khoản Admob của mình
    Tạo các ID cho Banner và Interstital mong muốn
2. Tải bản SDK phù hợp (iOS, Android), tích hợp vào dự án
3. Viết code để hiển thị quảng cáo, điều khiển ẩn hiện quảng cáo theo ý muốn.

Monday, February 9, 2015

iOS: Làm thể nào để sử dụng được iOS 7 SDK sau khi nâng cấp Xcode 6

Như chúng ta đã biết, thường thì sau khi nâng cấp Xcode lên phiên bản mới, Apple chỉ cho phép chúng ta build ứng dụng với SDK mới nhất, ví dụ với Xcode 6.x thì chúng ta chỉ có thể làm việc trên SDK 8.x


Tuesday, July 2, 2013

iOS: Ngôn ngữ lập trình Objective C - P3



1.1.                     Quản lý bộ nhớ

1.1.1.     Các nguyên tắc quản lý bộ nhớ

Nguyên tắc cơ bản
·        Khi bạn nắm quyền sở hữu một đối tượng, khởi tạo đối tượng bằng các phương thức mà trong tên bắt đầu với với alloc hoặc new hoặc copy (ví dụ, alloc, newObject hoặc mutableCopy…) hoặc gửi một thông điệp retain, bạn phải có trách nhiệm giải phóng quyền sở hữu đối tượng đó bằng cách sử dụng release hoặc autorelease. Bất kỳ khi nào bạn nhận được một đối tượng (không phải tự mình khởi tạo), bạn không được release nó.

Các nguyên tắc khác
·        Khi bạn cần lưu trữ một đối tượng được nhận như một propertytrong một biến thể hiện, bạn phải retain hoặc copy nó. (Điều này không đúng cho cho tham khảo yếu, nhưng đây là điển hình hiếm).
·        Một đối tượng được nhận thường đảm bảo vẫn có hiệu lực trong phương thức mà nó đã được nhận (ngoại trừ trong các ứng đa luồng và vài trường hợp Distributes Objects). Phương thức đó có thể trả về an toàn đối tượng mà nó được triệu gọi. Sử dụng retain trong việc kết hợp với release hoặc autorelease khi cần thiết để bảo vệ một đối tượng khỏi hiệu lực của các thông điệp không hợp lệ bên ngoài.
·        autoreleasecó nghĩa là “gửi một thông điệp releasesau đó


1.1.2.     Vấn đề khi khởi tạo đối tượng

Xét đoạn code khởi tạo đối tượng sau

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

  // Do something with the object
  if (ptr)
    ...
Thoạt nhìn qua có vẻ vô hại, phương thức alloc khởi tạo một vùng nhớ cho đối tượng ptr, sau đó gửi thông điệp gọi phương thức init cho đối tượng ptr, lỗi có thể xảy ra ở đây. Giả sử dòng lệnh ở dòng lệnh [ptr init], phương thức init có lỗi xảy ra và trả về nil, tiếp theo ở dòng lệnh if, lúc này ptr vẫn khác nil mặc dù phương thức inittrả về nil (nhưng nó không được gán cho ptr), dẫn tới ý nghĩa của phương thức tạo thực sự không còn nữa.

Khi đó, đoạn code sau sẽ giải quyết được khả năng lỗi ở trên

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

  // Do something with the object
  if (ptr)
    ...

Giả sử initcó lỗi và trả về nilthì ptr vẫn sẽ được gán là nil, do đó dòng lệnh ifsẽ thực hiện đúng ý nghĩa của nó.
Ý nghĩa từ ví dụ này đó là, ta luôn luôn phải trả về nil trong phương thức initnếu có lỗi khởi tạo xảy ra và lưu ý phải kết hợp 2 lời gọi phương thức allocinit.

1.1.3.     Release

Nếu bạn khởi tạo một đối tượng sử dụng cách thủ công alloc, bạn cần phải release đối tượng sau đó. Bạn không nên thực hiện release thủ công một đối tượng autorealse bởi vì ứng dụng có thể sẽ bị crash nếu bạn làm điều đó.

            // string1 will be released automatically
          NSString* string1 = [NSString string];

          // must release this when done
          NSString* string2 = [[NSString alloc] init];
          …..
          [string2 release];

1.1.4.     Retain


Trong Objective-C, mỗi đối tượng có một bộ đếm được sử dụng để kiểm soát tất cả các tham chiếu bởi đối tượng hoặc nó có.
Để biết được giá trị của bộ đếm này ta sử dụng thuộc tính retainCount [object retainCount]. Phương thức alloc, new, copyretain đều tăng bộ đếm này lên 1 và phương thức release giảm bộ đếm này đi 1, khi bộ đếm có giá trị bằng 0 thì phương thức dealloc của đối tượng sẽ được gọi.



Bất cứ khi nào một đối tượng có nhu cầu được sử dụng bởi một đối tượng khác nó phải retain để tăng bộ đếm retainCount lên 1, và khi nó không còn sử dụng nữa thì phải release để giảm bộ đếm retainCount đi 1. Khi bộ đếm có giá trị bằng 0 có nghĩa là nó không còn nhu cầu để sử dụng nữa, nó sẽ tự hủy bằng phương thức dealloc.

1.1.5.      Dealloc

Phương thức dealloc được gọi khi đối tượng đang được remove khỏi bộ nhớ. Nó thường được sử dụng nhất khi giải phóng tất cả các tham chiếu của các biến thể hiện con của đối tượng khỏi bộ nhớ. Hay nói cách khác, một lớp nếu có các biến thể hiện là các đối tượng thì trong phương thức dealloc của lớp phải thực hiện giải phóng các biến thể hiện này.

- (void)dealloc {
          [childVar1 release];
          [childVar2 release];
          [super dealloc];
}
Phương thức [super dealloc] được sử dụng để thông báo cho lớp cha thực hiện việc “dọn dẹp” (đây là phương thức được định nghĩa trong NSObject), nếu không gọi phương thức này, có thể đối tượng sẽ không được remove khỏi bộ nhớ, sẽ gây nên tình trạng chiếm bộ nhớ.

#import
#import "Address.h"

@interface Person : NSObject {
          Address* address;
}
-(Person*) constructor: (Address*) add;
-(void) show;
@end

#import "Person.h"

@implementation Person
-(Person*) constructor: (Address*) add{
          self = [super init];
          if(self){
                   address = add;
          }
          return self;
}
-(void) show{
          printf("Person: \n");
          printf("   --- ");
          [address show];
}
-(void) dealloc{
          printf("Dealloc method of Person\n");
          [address release];
          [super dealloc];
}
@end


#import
#import "Person.h"
#import "Name.h"

@interface VNPerson : Person {
          Name* name;
}
-(VNPerson*) constructor: (Address*) add : (int) idn;
@end

#import "VNPerson.h"
#import "Name.h"

@implementation VNPerson

-(VNPerson*) constructor: (Address*) add : (int) idn{
          self = [super constructor: add];
          if(self){
                   name = [[Name alloc] constructor: idn];
          }
          return self;
}
-(void) show{
          [super show];
          printf("   --- ");
          [name show];
}
-(void) dealloc{
          printf("Dealloc method of VNPerson\n");
          [name release];
          [super dealloc];// Mục đích giải phóng biến thể hiện address trong lớp cha
}
@end


#import "Address.h"
#import "VietnamAddress.h"
#import "Person.h"
#import "VNPerson.h"

int main(int argc, char *argv[]) {
   
          Address *address = [[Address alloc] constructor: 01 : 02];
          [address show];
          VietnamAddress *vnaddress = [[VietnamAddress alloc] constructor: 03 : 04];
          [vnaddress show];
          [vnaddress changeAddress: 05];
         
          Person *person = [[VNPerson alloc] constructor: address : 1915];
          [person show];
         
          [address release];
          [vnaddress release];
          [person release];
                  
          return 1;
}

Lưu ý: Phương thức dealloc sẽ không được gọi trong trường hợp bộ dọn rác được bật.





1.1.6.     Tham chiếu yếu

Retain một đối tượng tạo ra một tham chiếu “mạnh” đến đối tượng đó. Một đối tượng không thể dealloc cho tới khi tất cả các tham chiếu mạng được giải phóng hết.

Trong một số trường hợp, ta có thể muốn có một tham chiếu đến đối tượng mà không cản trở việc đối tượng tự giải phóng chính nó, lúc này ta có thể thiết lập một tham chiếu “yếu” đến đối tượng.
Một tham chiếu yếu được tạo ra bằng cách chứa một con trỏ trỏ đến một đối tượng mà không retain đối tượng đó. Tham chiếu yếu rất cần thiết trong việc thiết lập các tham chiếu vòng. Ví dụ, đối tượng A và đối tượng B cần trao đổi thông tin với nhau nên mỗi đối tượng cần một tham chiếu đến đối tượng kia (ví như mới quan hệ giữa 2 đối tượng cha - con), nếu như chúng ta retain đối tượng kia khi thiết lập tham chiếu thì mỗi đối tượng chỉ được dealloc khi nào kết nối này đứt, tuy nhiên kết nối này chỉ đứt khi có một đối tượng được dealloc mà thôi. Trong trường hợp này ta thấy được lợi ích của tham chiếu yếu.
Chúng ta phải thật cẩn thận khi truyền thông điệp trong tham chiếu yếu, trong trường hợp đối tượng nhận thông điệp đã dealloc thì ứng dụng có thể sẽ bị crash. Đồng thời, trong mối quan hệ tham chiếu yếu, đối tượng được tham chiếu đến phải có trách nhiệm báo cho đối tượng kia biết khi nó thực hiện dealloc, ví dụ gửi một thông điệp setDelegate:với tham số nil cho đối tượng kia chẳng hạn, trong trường hợp đối tượng dealloc là một Delegate của đối tượng nhận thông điệp.