2012-06-25 38 views
11

Tôi biết nó hỗ trợ các biến tự động, nhưng còn về biến lớp?Các biến lớp hỗ trợ Objective-C có hỗ trợ không?

+0

có thể trùng lặp của [Biến chuỗi tĩnh trong Mục tiêu C trên iphone] (http://stackoverflow.com/questions/980083/static-string-variable-in-objective-c-on-iphone) –

+0

http : //stackoverflow.com/questions/1063229/objective-c-static-class-level-variables –

Trả lời

23

Ngôn ngữ không hỗ trợ biến lớp. Bạn triển khai trạng thái cụ thể theo lớp với các biến số toàn cầu static trong các đơn vị biên dịch của việc triển khai.

Trong tiêu đề (file .h):

@interface MyClass : NSObject 
+(int)val; 
@end 

Trong việc thực hiện (file .m):

static int val = 123; 

@implementation MyClass 
+(int)val {return val;} 
@end 

Cách sử dụng:

if ([MyClass val] > 100) ... 
+0

ngôn ngữ này phải bị hủy) – user924

+0

@ user924 Vì tất cả các mục đích thực tế, ngôn ngữ đã chết. [Bạn đã bỏ lỡ bản ghi nhớ chưa?] (Https://developer.apple.com/swift /) – dasblinkenlight

+0

Tôi biết, nhưng tôi cần phải sử dụng OpenCV, và ở đây chúng tôi một lần nữa bằng cách sử dụng Objective-C – user924

4

biến lớp ObjC là đồng bằng biến tĩnh cũ.

Foo.m:

static int foo = 0; 

Ngoài ra, bạn có thể sử dụng một không gian tên C++ nặc danh nếu bạn sử dụng ObjC++:

Foo.mm:

namespace { 
    int foo = 0; 
} 

Nhưng có mô hình khác nếu bạn muốn hưởng lợi từ lợi thế của các thuộc tính:

Foo.h:

@interface FooShared 

@property (atomic, readwrite, strong) Foo* foo; 

@end 

@interface Foo 

+ (FooShared*) shared; 

@end 

Foo.m:

@implementation FooShared 
@end 

static fooShared* = nil; 

@implementation Foo 

+ (FooShared*) shared 
{ 
    if (fooShared == nil) fooShared = [FooShared new]; 

    return fooShared; 
} 

@end 

somewhere.m:

Foo* foo …; 
foo.shared.foo = …; 

Nó có thể nhìn một chút quá mức cần thiết, nhưng đó là một giải pháp thú vị. Bạn sử dụng các cấu trúc và tính năng ngôn ngữ giống nhau cho cả thuộc tính dụ và thuộc tính "lớp". Atomicity theo yêu cầu, accessors khi cần thiết, gỡ lỗi, breakpoints ... Thừa kế ngay cả.

Tư duy sáng tạo có thể tìm các cách khác để làm tất cả những điều này tôi cho là. :) Nhưng bạn có khá nhiều các tùy chọn này.

0
@property (class, nonatomic, copy) NSString *someStringProperty; 

Nhưng bạn phải cung cấp phương thức getter và setter

Từ Xcode 8 release notes: Objective-C bây giờ hỗ trợ thuộc tính của lớp, mà tương thích với thuộc tính loại Swift. Chúng được khai báo là: @property (class) NSString * someStringProperty ;. Chúng không bao giờ được tổng hợp. (23891898)