2013-06-06 35 views
7

Biến tĩnh khai báo trong C# như thế này:ios - Cách khai báo biến tĩnh?

private const string Host = "http://80dfgf7c22634nbbfb82339d46.cloudapp.net/"; 
private const string ServiceEndPoint = "DownloadService.svc/"; 
private const string ServiceBaseUrl = Host + ServiceEndPoint; 
public static readonly string RegisteredCourse = ServiceBaseUrl + "RegisteredCourses"; 
public static readonly string AvailableCourses = ServiceBaseUrl + "Courses"; 
public static readonly string Register = ServiceBaseUrl + "Register?course={0}"; 

Làm thế nào để gọi biến tĩnh này trong lớp khác?

+1

Vì "biến tĩnh" không phải là cụm từ được xác định rõ trong Mục tiêu-C và các nghĩa khác nhau thường bị nhầm lẫn, không rõ bạn đang hỏi gì ở đây. Bạn có muốn biến lớp có quyền truy cập thông qua giao diện lớp không? Hoặc là nó về thời gian lưu trữ tĩnh? –

+0

Và ở đây tôi đã nghĩ rằng "biến tĩnh" là cực kỳ được xác định rõ ràng trong Objective-C, với chính xác cùng ý nghĩa như trong C. – gnasher729

Trả lời

11

Trả lời: sử dụng từ khóa static.

Cú pháp:static ClassName *const variableName = nil; (Cập nhật [Added const] theo Comment by Abizern)


Lý do cập nhật (Theo ý kiến ​​của "Till"): static khi được sử dụng trên một biến trong một hàm/phương thức sẽ giữ nguyên trạng thái của nó ngay cả khi phạm vi của biến đó bị bỏ lại. Khi được sử dụng bên ngoài bất kỳ hàm/phương thức nào, nó sẽ biến biến đó thành ẩn với các tệp nguồn khác - nó sẽ chỉ hiển thị trong tệp triển khai đó khi được sử dụng bên ngoài bất kỳ hàm/phương thức nào. Do đó, const với static giúp trình biên dịch tối ưu hóa nó cho phù hợp.

Nếu bạn cần giải thích thêm về việc sử dụng const với static, tôi đã tìm thấy một liên kết tuyệt đẹp tại đây: const static.


Sử dụng:

Bạn có thể đã thấy việc sử dụng các "tĩnh" từ khóa trong đại biểu của tableview bạn - cellForRowAtIndexPath:

static NSString *CellIdentifier = @"reuseStaticIdentifier";

+2

Tôi muốn viết 'static NSString * const staticURL = @" something ";' – Abizern

+2

@Abizern : Bạn có thể giải thích cho tôi lý do đằng sau 'const'? – Bhavin

+2

@Vin biến đó sẽ không bao giờ được thay đổi trong thời gian chạy, do đó một const giúp trình biên dịch tối ưu hóa nó cho phù hợp. – Till

2

Objective C là siêu bộ C/C++, vì vậy đối với tĩnh theo quy ước C++/C, bạn có thể sử dụng nó

static <<datatype>> <<variableName>> = initialization 

Hy vọng bạn sẽ cố gắng theo cách này, có bạn có bất kỳ lỗi, nếu có, xin vui lòng thêm rõ ràng hơn trong câu hỏi của bạn

nếu thats trường hợp với NSString sử dụng sau,

static NSString *pString = @"InitialValue"; 

và nếu bạn phải sửa đổi NSString trong mã của mình, hãy đảm bảo mã đó phải là NSMutableString.

Hope đó là sự giúp đỡ ...

+0

Nếu một biến tĩnh của nó tại sao bạn muốn sửa đổi nó? – Abizern

+0

Bạn phải giải thích thêm về điều này: để sửa đổi chuỗi Bởi vì điều này cũng hợp lệ: 'myString = [NSString stringWithFormat: @" Thêm chuỗi% @ ", myString]'; – pbibergal

+1

Mục tiêu-C là một siêu của C, không có C++ liên quan. Trên thực tế ngữ nghĩa của 'static' hơi khác nhau giữa C và C++. –

5
static NSString *aString = @""; // Editable from within .m file 
NSString * const kAddressKey = @"address"; // Constant, visible within .m file 

// in header file 
extern NSString * const kAddressKey; // Public constant. Use this for e.g. dictionary keys. 

Theo hiểu biết của tĩnh học công cộng của tôi không phải là một tích hợp tính năng của Objective-C. Bạn có thể giải quyết vấn đề này bằng cách tạo phương thức lớp công khai trả về biến tĩnh:

//.h 
+ (NSString *)stringVariable; 

//.m 
static NSString * aString; 
+ (NSString *)stringVariable 
{ 
    return aString; 
} 

Hầu hết các đối tượng tĩnh không thể khởi tạo lúc biên dịch (tôi nghĩ chỉ có chuỗi). Nếu bạn cần khởi tạo chúng, bạn có thể làm như vậy theo phương thức + (void)initialize, được gọi một cách uể oải bất cứ khi nào lớp đó được tham chiếu lần đầu tiên.

static UIFont *globalFont; 
+ (void)initialize 
{ 
    // Prevent duplicate initialize http://www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html 
    if (self == [ClassName class]) { 
     globalFont = [UIFont systemFontOfSize:12]; 
    } 
} 
Các vấn đề liên quan