2013-03-12 12 views
10

Tôi luôn thấy soạn sẵn cho UITableViewController tuyên bốWhats lợi thế của việc sử dụng một NSString tĩnh cho CellIdentifier là gì?

static NSString *CellIdentifier 

trong

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 

Tại sao tĩnh? Tôi đã thay đổi điều này ở nhiều nơi bởi vì các thay đổi CellIdentifier của tôi dựa trên phần này? lý do đằng sau điều này là tĩnh là gì? Tôi có ảnh hưởng đến hiệu suất không?

Trả lời

21

cellForRowAtIndexPath: được gọi là rất nhiều. Bất cứ lúc nào bạn có một phương thức được gọi đi lặp lại trong một khoảng thời gian ngắn bạn muốn giảm thiểu số lượng các đối tượng đang chờ để được tự động phát hành, vì các đối tượng này sẽ được giữ lại trên stack cho đến khi - tối thiểu - vòng lặp chạy tiếp theo. Sử dụng một chuỗi tĩnh đảm bảo rằng đối tượng chuỗi chỉ được tạo một lần, thay vì mỗi lần phương thức được gọi.

Không cần thiết, nhưng khi bạn có một số lượng bộ nhớ hạn chế như trên thiết bị di động, bạn muốn tối ưu hóa số đối tượng được tạo trong một khoảng thời gian ngắn, nếu có thể.

+0

Vì vậy, tôi nên sử dụng NSString tĩnh cho mỗi số nhận dạng? –

+0

Có. Thành thật mà nói, nếu bạn có một số lượng nhỏ các hàng trong bảng của bạn, nó sẽ không tạo ra nhiều sự khác biệt - iOS đã thu thập được nhiều rác hơn, đặc biệt kể từ khi ARC ra mắt. Nhưng ngay cả như vậy, nó là một tối ưu hóa mà không mất công sức, vì vậy bạn cũng có thể sử dụng nó. – memmons

+0

cảm ơn điều này là một sự tò mò hơn là một vấn đề phá vỡ nhưng tốt để biết tiến lên phía trước. cảm ơn. –

0

Mặc dù tôi đồng ý với @Answerbot về khía cạnh hiệu suất của các chuỗi tĩnh, nhưng cũng đáng lưu ý rằng các chuỗi tĩnh ít bị lỗi hơn. IDE sẽ tự động hoàn thành đối tượng NSString tĩnh, do đó đảm bảo rằng chuỗi được đặt tên nhất quán.

EDIT:

Nếu bạn sử dụng đoạn mã sau:

static NSString *cellIndentifier = @"myCellIdentifier"; 

bạn có thể sau đó tự do sử dụng các biến 'cellIdentifier' mà không lo lắng về chính tả của chuỗi thực tế đang được sử dụng.

+3

Ý của bạn là gì? Xcode sẽ tự động hoàn thành bất kỳ tên biến nào. –

+1

xcode tự động hoàn thành mọi thứ, bất kể nó là tĩnh, cục bộ hay thậm chí là macro. –

+0

Vâng, ý tôi là bằng cách nói NSString tĩnh * cellIdentifier = @ "cellIdentifier"; bạn có thể sử dụng các hàm tự động hoàn thành của XCode cho biến cellIdentifier thay vì có thể sửa đổi và viết @ "CellIdentifier" hoặc @ "cellidentifier" khi bạn định nói @ "cellIdentifier" – JiuJitsuCoder

3

Khi biến được khai báo static, chỉ có một phiên bản của biến đó trong chương trình. Vì đây là một giá trị không đổi chỉ được gán một lần, cách tiếp cận này tránh đặt trước và gán một biến ngăn xếp cho nó. Tất nhiên, biến stack gần như chắc chắn được tối ưu hóa bởi trình biên dịch, và chuỗi contant đã được tối ưu hóa thành lưu trữ tĩnh bởi trình biên dịch. Vì vậy, nó là một tối ưu hóa khá nhỏ đó là càng nhiều một gợi ý về những gì các nhà phát triển có nghĩa là (tức là tất cả các trường hợp chia sẻ cùng một giá trị) như bất cứ điều gì khác.