Bộ chọn không nhận dạng được gửi đến phiên bản lỗi Lỗi trong Objective-C


155

Tôi đã tạo một nút và thêm một hành động cho nó, nhưng ngay khi nó được gọi, tôi đã gặp lỗi này:

-[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance
 0x3d03ac0 2010-03-16 22:23:58.811
 Money[8056:207] *** Terminating app
 due to uncaught exception
 'NSInvalidArgumentException', reason:'*** -[NSCFDictionary numberButtonClick:]:  unrecognized selector sent to instance 0x3d03ac0'

Đây là mã của tôi:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        UIButton *numberButton = [UIButton buttonWithType:UIButtonTypeCustom];        
        numberButton.frame = CGRectMake(10, 435, 46, 38);
        [numberButton setImage:[UIImage imageNamed:@"one.png"] forState:UIControlStateNormal];
        [numberButton addTarget:self action:@selector(numberButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview: numberButton]; 
    }
return self;
}

-(IBAction)numberButtonClick:(id)sender{
    NSLog(@"---");
}

Câu trả lời:


187

Có vẻ như bạn không phải là bộ nhớ quản lý bộ điều khiển chế độ xem đúng cách và nó đang bị xử lý tại một số điểm - điều này khiến numberButtonClicked:phương thức được gửi đến một đối tượng khác hiện đang chiếm bộ nhớ mà bộ điều khiển chế độ xem đang chiếm giữ ...

Hãy chắc chắn rằng bạn đang giữ / giải phóng bộ điều khiển xem của mình.


105
Đó là một chẩn đoán rất sắc sảo từ một vài dòng mã.
Michael Morrison

41
OK, do đó, vấn đề đã được xác định ... nhưng "Hãy chắc chắn rằng bạn giữ lại / giải phóng bộ điều khiển chế độ xem của mình." là một gợi ý, không phải là một giải pháp.
Alex Gray

12
@alex xám, Cái gì? Quản lý bộ nhớ đúng trên bộ điều khiển khung nhìn đã giải quyết vấn đề ... Tôi không hiểu làm thế nào đó không phải là một giải pháp?
Jasarien

28
chính xác. mặc dù điều này dường như là "cách khắc phục" .. và tôi có thể là thiểu số, (mặc dù tôi vẫn cố gắng tồn tại), nhưng mối liên hệ giữa vấn đề và giải pháp không rõ ràng ngay lập tức. ví dụ, tôi đang gặp phải -[NSWindow end]: unrecognized selector sent to instance 0x100523e80 và mặc dù tôi nhận ra những điểm tương đồng với OP và thậm chí có thể là nguyên nhân gây ra sự cố từ câu trả lời của bạn, việc thực hiện sửa lỗi không rõ ràng ngay lập tức
Alex Gray

12
Đó là ngay lập tức rõ ràng. Quản lý bộ nhớ NSWindow của bạn không chính xác ở đâu đó dọc theo dòng. Trải qua vòng đời của nó và sửa nó.
Jasarien

127

Đối với những người đến đây thông qua Google như tôi đã làm, có lẽ liên quan nhiều hơn đến Xcode 4.2 + / iOS 5+ trở lên, với ARC. Tôi đã có cùng một lỗi " bộ chọn không nhận dạng được gửi đến ví dụ ". Trong trường hợp của tôi, tôi đã có một hành động mục tiêu của UIButton được thiết lập để truyền chính nó làm tham số người gửi, nhưng sau đó nhận ra rằng tôi không cần nó và loại bỏ nó trong mã. Vì vậy, một cái gì đó như:

- (IBAction)buttonPressed:(UIButton *)sender {

Đã được đổi thành:

- (IBAction)buttonPressed {

Nhấp chuột phải vào nút UIB trong câu hỏi cho thấy rằng sự kiện Touch Up Inside được liên kết với phương thức nút điều khiển xemPress :. Loại bỏ điều này và gán lại nó cho phương pháp sửa đổi đã làm việc một điều trị.


Điều này rất hữu ích, mặc dù tôi nghĩ rằng câu hỏi và câu trả lời của riêng nó sẽ giúp bạn dễ dàng tìm thấy hơn.
Curtis Inderwiesche

@LeonardChallis Làm thế nào bạn có thể tham chiếu người gửi trong buttonPress nếu nó không được truyền dưới dạng tham số?
zakdances

8
Phản ứng rất hữu ích. Tôi chỉ gặp vấn đề chính xác này và giải pháp của bạn là hoàn toàn chính xác. Đã theo lớp Stanford Stanford trên iTunesU khi điều này xảy ra. Cảm ơn một lần nữa cho câu trả lời của bạn!
Marshall Alsup

1
@LeonardChallis Cảm ơn. Tôi đã thêm một câu trả lời miễn phí cho câu trả lời của bạn.
1,21 gigawatt

1
Tôi chỉ đang vật lộn với một vấn đề tương tự, loại bỏ tham số người gửi khỏi chức năng chọn và sau đó tự hỏi làm thế nào để có được người gửi. Trong trường hợp của tôi, tôi đã nhận được lỗi vì tôi quên đặt dấu hai chấm sau khi gọi lại bộ chọn, do đó gây ra một chuỗi cuộc gọi không khớp. Với dấu hai chấm, tôi có thể giữ đối số người gửi.

74

Đây là câu trả lời hàng đầu của Google cho vấn đề này, nhưng tôi có một nguyên nhân / kết quả khác - tôi nghĩ tôi đã thêm vào hai xu của mình trong trường hợp những người khác vấp phải vấn đề này.

Tôi đã có một vấn đề tương tự chỉ sáng nay. Tôi thấy rằng nếu bạn nhấp chuột phải vào mục UI cung cấp cho bạn vấn đề, bạn có thể thấy những kết nối nào đã được tạo. Trong trường hợp của tôi, tôi có một nút có dây lên đến hai hành động. Tôi đã xóa các hành động từ menu chuột phải và viết lại chúng và vấn đề của tôi đã được khắc phục.

Vì vậy, hãy chắc chắn rằng hành động của bạn được lên dây đúng.


Đây là vấn đề của tôi. Tôi đã đổi tên một hàm và thay đổi mã của mình nhưng không thay đổi kết nối trong tệp xib.
BFTrick

2
CẢM ƠN BẠN! Hóa ra tôi có ba phương thức mà tôi đã xóa vẫn được tham chiếu. Làm phiền tôi trong một tuần!
erdekhayser

25

OK, tôi phải chip ở đây. OP tự động tạo nút . Tôi đã có một vấn đề tương tự và câu trả lời (sau nhiều giờ săn bắn) rất đơn giản, nó làm tôi phát ốm.

Khi đang sử dụng:

action:@selector(xxxButtonClick:)

or (as in my case)

action:NSSelectorFromString([[NSString alloc] initWithFormat:@"%@BtnTui:", name.lowercaseString])

Nếu bạn đặt dấu hai chấm ở cuối chuỗi - nó sẽ vượt qua người gửi. Nếu bạn không đặt dấu hai chấm ở cuối chuỗi thì nó sẽ không bị lỗi và người nhận sẽ gặp lỗi nếu nó mong đợi. Rất dễ bỏ lỡ dấu hai chấm nếu bạn tự động tạo tên sự kiện.

Các tùy chọn mã người nhận trông như thế này:

- (void)doneBtnTui:(id)sender {
  NSLog(@"Done Button - with sender");
}
 or
- (void)doneBtnTui {
  NSLog(@"Done Button - no sender");
}

Như thường lệ, nó luôn luôn là câu trả lời rõ ràng bị bỏ lỡ.


1
Cảm ơn bạn rất nhiều! Đây là vấn đề của tôi (không đặt dấu hai chấm ':' ở cuối tên của bộ chọn). Tại sao nó luôn luôn là những điều đơn giản ngu ngốc nhất khiến chúng ta phải đập đầu vào tường lúc 3 giờ sáng? Chân thanh cảm ơn bạn!
TWright

23

Trong trường hợp của tôi, hàm không mong đợi một đối số nhưng nút được cấu hình để gửi một đối tượng gây ra lỗi. Để khắc phục điều này, tôi đã phải xử lý lại trình xử lý sự kiện.

Đây là chức năng của tôi:

nhập mô tả hình ảnh ở đây

Lưu ý rằng nó không chứa đối số.

Đây là hình ảnh về cấu hình nút của tôi (nhấp chuột phải vào nút để xem):

nhập mô tả hình ảnh ở đây

Thông báo có 3 xử lý sự kiện.

Để khắc phục điều này, tôi đã phải xóa từng mục sự kiện vì một trong số chúng đang gửi một tham chiếu đến chính nó đến hàm enterPression. Để xóa các mục này, tôi nhấp vào biểu tượng x nhỏ bên cạnh tên của từng mục cho đến khi không có mục nào được hiển thị.

nhập mô tả hình ảnh ở đây

Tiếp theo tôi phải kết nối lại nút đến sự kiện. Để thực hiện việc này, giữ phím Control và sau đó kéo một dòng từ nút đến hành động. Nó sẽ nói "Kết nối hành động". Lưu ý: Tôi đã phải khởi động lại XCode để nó hoạt động vì một số lý do; mặt khác, nó chỉ cho phép tôi chèn các hành động (còn gọi là tạo một hành động mới) bên trên hoặc bên dưới hàm.

nhập mô tả hình ảnh ở đây

Bây giờ bạn sẽ có một trình xử lý sự kiện duy nhất được nối với sự kiện nút mà không có đối số:

nhập mô tả hình ảnh ở đây

Câu trả lời này khen ngợi câu trả lời của @Leonard Challis mà bạn cũng nên đọc.


14

Điều này cũng có thể xảy ra nếu bạn không đặt "Lớp" của chế độ xem trong trình tạo giao diện.


Cảm ơn bạn Điều này đã khiến ứng dụng của tôi gặp sự cố trên segue, chỉ quên cài đặt lớp của bộ điều khiển.
Eichhörnchen

Tại sao nó cần phải biết lớp? Tôi đang cố gắng sử dụng UITableViewSection làm UIView và vì vậy tôi gặp lỗi này. Trình biên dịch nói rằng UITableViewSection không tồn tại nên tôi đoán nó là UIKit.
Ian Warburton

13

Trong trường hợp của tôi, tôi đã sử dụng NSNotificationCenter và đang cố gắng sử dụng bộ chọn không có đối số, nhưng đang thêm dấu hai chấm. Loại bỏ đại tràng đã khắc phục vấn đề.

Khi sử dụng tên bộ chọn, không sử dụng dấu hai chấm nếu không có đối số. Nếu có một đối số, sử dụng một dấu hai chấm. Nếu có nhiều hơn một đối số, bạn phải đặt tên cho chúng cùng với dấu hai chấm cho mỗi đối số.

Xem câu trả lời của Adam Rosenfield tại đây: Bộ chọn trong Objective-C?


11

Tôi gặp vấn đề này với một dự án Swift nơi tôi đang tạo các nút động. Mã vấn đề:

var trashBarButtonItem: UIBarButtonItem {
    return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked")
}

func newButtonClicked(barButtonItem: UIBarButtonItem) {
    NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
}

Giải pháp là thêm dấu hai chấm đầy đủ ':' sau hành động: vd

var trashBarButtonItem: UIBarButtonItem {
        return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked:")
    }

    func newButtonClicked(barButtonItem: UIBarButtonItem) {
        NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
    }

Ví dụ đầy đủ tại đây: https://developer.apple.com/l Library / content / samplecode / UICatalog / Listings / Swift_UIKitCatalog_DefaultToolbarViewControll_swift.html


Ngay sau khi làm theo hướng dẫn và đọc một gợi ý về vấn đề chính xác này - tôi đã yêu nó: D
user2161301

6

Nguyên nhân rõ ràng nhất của điều này (bao gồm sự hoàn chỉnh) là việc đúc không đúng một con trỏ và gọi một phương thức của lớp sai.

NSArray* array = [[NSArray alloc] init];
[(NSDictionary*)array objectForKey: key]; // array is not a dictionary, hence exception

Đây là một gợi ý hay - không phân lớp một khung nhìn hoặc đối tượng dữ liệu (ví dụ: do không thêm tên lớp con) là một cách khác xảy ra
Brad M

4

Tôi cũng có vấn đề tương tự.

Tôi đã xóa uibutton của mình trong bảng phân cảnh của mình và tạo lại nó .. bây giờ mọi thứ đều hoạt động tốt.


3

Tôi đã có một vấn đề tương tự, nhưng đối với tôi giải pháp hơi khác một chút. Trong trường hợp của tôi, tôi đã sử dụng một loại để mở rộng một lớp hiện có (UIImage cho một số khả năng thay đổi kích thước - xem này howto trong trường hợp bạn đang quan tâm) và quên để thêm tập tin .m * để xây dựng mục tiêu. Lỗi ngu ngốc, nhưng không phải lúc nào cũng rõ ràng khi nó xảy ra ở đâu để tìm. Tôi nghĩ rằng nó đáng để chia sẻ ...


3

Điều này đã xảy ra với tôi vì vô tình xóa "@IBAction func ..." bên trong mã lớp UIViewcontroll của tôi, vì vậy trong Storyboard đã được tạo ra Reference Outlet, nhưng trong thời gian chạy, có bất kỳ chức năng nào để xử lý nó.

Giải pháp là xóa tham chiếu Outlet bên trong trình kiểm tra thuộc tính và sau đó tạo lại nó kéo bằng phím lệnh vào mã lớp.

Hy vọng nó giúp!


Tương tự, điều này cũng xảy ra với tôi khi nút tham chiếu một chức năng không còn tồn tại.
Josh Wolff

2

Tôi nghĩ bạn nên sử dụng khoảng trống, thay vì IBAction trong kiểu trả về. bởi vì bạn đã xác định một nút lập trình.


2

Một giải pháp khả thi khác: Thêm '-ObjC' vào các đối số liên kết của bạn.

Giải thích đầy đủ có ở đây: Các loại Objective-C trong thư viện tĩnh

Tôi nghĩ ý chính là: nếu danh mục được xác định trong thư viện mà bạn đang liên kết tĩnh, thì trình liên kết không đủ thông minh để liên kết trong các phương thức thể loại. Cờ ở trên làm cho liên kết liên kết trong tất cả các lớp và danh mục C mục tiêu, không chỉ các liên kết mà nó nghĩ rằng nó cần dựa trên việc phân tích nguồn của bạn. (Xin vui lòng điều chỉnh hoặc sửa câu trả lời đó. Tôi đã biết các ngôn ngữ được liên kết, vì vậy tôi chỉ nói vẹt ở đây).


2

Tôi đã có cùng một lỗi và tôi phát hiện ra những điều sau đây:

Khi bạn sử dụng mã

[self.refreshControl addTarget:self action:@selector(yourRefreshMethod:) forControlEvents:UIControlEventValueChanged];

Bạn có thể nghĩ rằng nó đang tìm kiếm bộ chọn:

- (void)yourRefreshMethod{
    (your code here)
}

Nhưng nó thực sự đang tìm kiếm bộ chọn:

- (void)yourRefreshMethod:(id)sender{
    (your code here)
}

Bộ chọn đó không tồn tại, do đó bạn gặp sự cố.

Bạn có thể thay đổi bộ chọn để nhận (id) người gửi để giải quyết lỗi.

Nhưng nếu bạn có các chức năng khác gọi chức năng làm mới mà không cung cấp người gửi thì sao? Bạn cần một chức năng hoạt động cho cả hai. Giải pháp dễ dàng là thêm chức năng khác:

- (void)yourRefreshMethodWithSender:(id)sender{
    [self yourRefreshMethod];
}

Và sau đó sửa đổi mã kéo xuống làm mới để gọi bộ chọn đó thay vào đó:

[self.refreshControl addTarget:self action:@selector(yourRefreshMethodWithSender:) forControlEvents:UIControlEventValueChanged];

Tôi cũng đang tham gia khóa học Stanford iOS trên máy Mac cũ không thể nâng cấp lên phiên bản Mac OSX mới nhất. Vì vậy, tôi vẫn đang xây dựng cho iOS 6.1 và điều này đã giải quyết vấn đề cho tôi.


2

Trong trường hợp của tôi, tôi đã giải quyết vấn đề sau 2 giờ:

Người gửi (một mục tabBar) không có bất kỳ Cửa hàng tham chiếu nào . Vì vậy, nó đã chỉ ra hư không.

Juste tạo ra một cửa hàng tham chiếu tương ứng với chức năng của bạn.

Hy vọng điều này có thể giúp các bạn.


Chỉ cần thêm, trong trường hợp của tôi, tôi đã quên chuyển IBActionsang Swift. Vì vậy, nó đã phàn nàn rằng nó muốn gọi chức năng đó, nhưng nó không thể được tìm thấy.
DevNebulae

1

Tôi hiện đang học phát triển iOS và trải qua cuốn sách "Bắt đầu phát triển iOS6" của aPress. Tôi đã nhận được cùng một lỗi trong Chương 10: Storyboards.

Tôi mất hai ngày để tìm ra nó nhưng phát hiện ra tôi vô tình đặt thẻ của ô TableView thành 1 khi tôi không nên có. Đối với bất cứ ai khác làm cuốn sách này và nhận được một lỗi tương tự, tôi hy vọng điều này sẽ giúp.

Tôi thực sự hy vọng các lỗi trong tương lai trong mã của tôi sẽ dễ dàng tìm thấy hơn! hahaha Lỗi gỡ lỗi không làm gì để đẩy tôi đi đúng hướng để tìm ra nó (hoặc ít nhất là tôi quá mới để hiểu trình gỡ lỗi, lol).


1

Trong trường hợp của tôi, tôi đã sử dụng UIWebView và tôi đã truyền NSString trong tham số thứ hai thay vì NSURL. Vì vậy, tôi nghi ngờ rằng các loại lớp sai được truyền cho một hàm có thể gây ra lỗi này.


1

.. Và bây giờ của tôi

Tôi đã có nút được liên kết với một phương thức truy cập tham số của nút khác và nó hoạt động rất tốt NHƯNG ngay khi tôi cố gắng làm gì đó với chính nút đó, tôi đã gặp sự cố. Trong khi biên dịch, không có lỗi nào được hiển thị .. Giải pháp?

Tôi không thể liên kết nút với chủ sở hữu của tập tin. Vì vậy, nếu có ai ở đây ngu ngốc như tôi, hãy thử điều này :)


1

Một giải pháp / trường hợp hơi khác nhau.

Tôi đang sử dụng Xamarin và MvvmCross và tôi đã cố gắng liên kết UIButton với ViewModel. Tôi đã có UIButton được nối với một Outlet và TouchUpInside.

Khi Binding tôi chỉ sử dụng Outlet:

set.Bind (somethingOutlet).For ("TouchUpInside").To(vm => vm.Something);

Tất cả những gì tôi phải làm là xóa kết nối hành động (TouchUpInside) trong XCode và điều đó đã giải quyết nó.

Tái bút: Tôi đoán đây là cơ sở của tất cả liên quan đến các câu trả lời trước đó và đặc biệt là @Chris Kaminski, nhưng tôi hy vọng điều này sẽ giúp ai đó ...

Chúc mừng.


1

Tôi gặp vấn đề tương tự. Vấn đề đối với tôi là một nút có hai phương thức Hành động. Những gì tôi đã làm là tạo một phương thức hành động đầu tiên cho nút của mình và sau đó xóa nó trong trình điều khiển xem, nhưng quên ngắt kết nối trong bảng phân cảnh chính trong trình kiểm tra kết nối. Vì vậy, khi tôi thêm một phương thức hành động thứ hai, bây giờ có hai phương thức hành động cho một nút, gây ra lỗi.


1

Đối với tôi, đó là một kết nối còn sót lại được tạo ra trong giao diện kéo ctac. Tên của kết nối bị hỏng là trong nhật ký lỗi

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[NameOfYourApp.NameOfYourClass nameOfCorruptConnection:]:
unrecognized selector sent to instance 0x7f97a48bb000'

Tôi đã có một hành động liên kết với một nút. Nhấn nút đã làm hỏng ứng dụng vì Outlet không còn tồn tại trong mã của tôi. Tìm kiếm tên trong nhật ký đã dẫn tôi đến nó trong bảng phân cảnh. Đã xóa nó, và vụ tai nạn đã biến mất!


0

Tôi đang trả lời Leonard Challis, vì tôi cũng đang học lớp C193P của Stanford, cũng như người dùng "oli206"

"Chấm dứt ứng dụng do ngoại lệ chưa được phát hiện 'NSInvalidArgumentException', lý do:"

Vấn đề là tôi đã có nút "Enter" trên máy tính được kết nối hai lần và một người bạn đã chỉ ra rằng việc kiểm tra nút trong Storyboard cho thấy 2 mục nhập thuộc tính "Touch Up Inside" khi tôi nhấp chuột phải vào nút "Enter". Xóa một trong hai "Touch Up Inside" "Sent Events" đã giải quyết được vấn đề.

Điều này cho thấy vấn đề được kích hoạt (đối với lớp video C193P trên Hướng dẫn tính toán trên Bài tập 1) là 2 sự kiện đã gửi, một trong số đó đã gây ra ngoại lệ.


Tôi đã có 3 mục một số cách. :)
1,21 gigawatt

0

Nó có thể xảy ra khi bạn không gán ViewContoder cho ViewControllScene trong InterfaceBuilder. Vì vậy, ViewControll.m không được kết nối với bất kỳ cảnh nào.


0

Bao gồm cả chia sẻ của tôi. Tôi đã bị mắc kẹt trong một thời gian, cho đến khi tôi nhận ra rằng tôi đã tạo một dự án với ARC (Tham chiếu đếm tự động) bị vô hiệu hóa. Một cài đặt nhanh thành CÓ trên tùy chọn đó đã giải quyết vấn đề của tôi.


0

Một nguyên nhân thực sự ngớ ngẩn khác của việc này là có bộ chọn được xác định trong giao diện (.h) nhưng không có trong triển khai (.m) (pe typo)


0

Một lý do / giải pháp khác để thêm vào danh sách. Điều này được gây ra bởi iOS6.0 (và / hoặc lập trình xấu). Trong các phiên bản cũ, bộ chọn sẽ khớp nếu các loại tham số khớp, nhưng trong iOS 6.0 tôi gặp sự cố trong mã làm việc trước đó trong đó tên của tham số không chính xác.

Tôi đã làm một cái gì đó như

[objectName methodName:@"somestring" lat:latValue lng:lngValue];

nhưng trong định nghĩa (cả .h và .m) tôi đã có

(viod) methodName:(NSString *) latitude:(double)latitude longitude:(double)longitude;

Điều này hoạt động tốt trên iOS5 nhưng không phải trên 6, ngay cả bản dựng chính xác được triển khai cho các thiết bị khác nhau.

Tôi không hiểu tại sao trình biên dịch lại không cho tôi biết điều này, dù sao đi nữa - vấn đề đã được giải quyết.


0

Điều này cũng có thể xảy ra khi bạn muốn đặt thuộc tính từ Bộ điều khiển thành thuộc tính công cộng bên trong lớp Trình điều khiển tùy chỉnh và bạn chưa đặt "Lớp tùy chỉnh" bên trong trình kiểm tra danh tính trong bảng phân cảnh.


0

Vấn đề và giải pháp của tôi là khác nhau và tôi nghĩ tôi nên đăng nó ở đây để độc giả tương lai có thể cứu đầu họ khỏi đập vào tường.

Tôi đã phân bổ xib khác nhau cho cùng một UIVIewCont kiểm soát và thậm chí sau khi tìm kiếm ở mọi nơi tôi không thể tìm cách sửa nó. Sau đó, tôi đã kiểm tra AppDelegate của mình nơi tôi đang gọi initWithNibNamevà có thể thấy rằng trong khi sao chép mã, tôi đã thay đổi tên xib, nhưng quên thay đổi UIViewControllerlớp. Vì vậy, nếu không có giải pháp nào phù hợp với bạn, hãy kiểm tra initWithNibNamephương pháp của bạn .


0

Đã xảy ra với tôi vì những tranh luận ràng buộc mâu thuẫn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.