SỬ DỤNG #define:
bạn không thể gỡ lỗi các giá trị của Mã định danh
làm việc với #define và các macro khác là công việc của Pre-Processor, Khi bạn nhấn Build/Run trước, nó sẽ xử lý trước mã nguồn, nó sẽ hoạt động với tất cả các macro (bắt đầu với ký hiệu #),
Giả sử, bạn đã tạo ra,
#define LanguageTypeEnglish @"en"
và sử dụng này tại 2 nơi trong mã của bạn.
NSString *language = LanguageTypeEnglish;
NSString *languageCode = LanguageTypeEnglish;
nó sẽ thay thế "LanguageTypeEnglish" với @"en"
, ở tất cả các nơi. Vì vậy, 2 bản sao của @"en"
sẽ được tạo. ví dụ:
NSString *language = @"en";
NSString *languageCode = @"en";
Hãy nhớ rằng, cho đến khi quá trình này, trình biên dịch không có trong hình.
Sau khi tiền xử lý tất cả các macro, biên dịch đi kèm trong hình ảnh, và nó sẽ nhận được mã đầu vào như thế này,
NSString *language = @"en";
NSString *languageCode = @"en";
và biên dịch nó.
SỬ DỤNG tĩnh:
nó tôn trọng phạm vi và là loại an toàn. bạn có thể gỡ lỗi giá trị định danh
Trong quá trình biên soạn, nếu trình biên dịch tìm thấy,
static NSString *LanguageTypeRussian = @"ru";
sau đó nó sẽ kiểm tra xem biến có cùng tên được lưu trữ trước đó, nếu có, nó sẽ chỉ vượt qua con trỏ của biến đó, nếu không, nó sẽ tạo biến đó và chuyển con trỏ của nó, lần sau trở đi nó sẽ chỉ truyền con trỏ của cùng một biến.
Vì vậy, sử dụng tĩnh, chỉ một bản sao của biến được tạo trong phạm vi.
Liên tục chuỗi liên kết là công việc của trình biên dịch chứ không phải trình liên kết. – kennytm
Điều này không đúng. Objective-c sử dụng [String Interning] (https://en.wikipedia.org/wiki/String_interning) như được mô tả [ở đây] (http://nshipster.com/equality/). '# define' không _not_ lưu một bản sao của chuỗi cho mỗi lần sử dụng. Và @kennytm là đúng, trình biên dịch thực hiện điều đó, không phải là mối liên kết –
@ AndréFratelli Trong thực tế, chuỗi liên kết coalescing là một tối ưu hóa liên kết, và nó được thực hiện bởi liên kết tĩnh trong OS X/macOS cho cả C và CF/NSStrings . Nó không được thực hiện bằng cách sử dụng chuỗi interning, và nó không được thực hiện bởi trình biên dịch (mặc dù trình biên dịch có thể coalesce strings chính nó trước khi viết ra các tập tin đối tượng tạo ra nó). Bạn có thể thấy mã thực hiện điều này trong [nguồn liên kết] (http://opensource.apple.com/source/ld64/ld64-264.3.102/). Cho nên không, kennytm không đúng; nó thực sự là mối liên kết. – alastair