2012-05-21 30 views
12

Tôi cần tạo một biến mẫu của loại BOOL với giá trị mặc định là False trong một trong các lớp Objective-C của tôi. Làm thế nào để tôi làm điều này? Tôi đã nhìn thấy mọi người xác định nó trong tập tin .h của họ nhưng tôi không thực sự cần biến này để được công khai. Vì vậy, tôi không nên đặt nó trong tập tin .m của tôi? Ngoài ra, tôi có nên biến nó thành tài sản không? Hoặc tôi có nên không làm một cái gì đó một tài sản? Cảm ơn.Làm thế nào để tạo một biến cá thể BOOL trong mục tiêu c?

+0

Hãy thử: '- (void) {viewDidLoad BOOL flag = NO; } '. Cũng một khi bạn muốn khai báo trong nó .m tập tin bạn không thể bất động sản tổng hợp nó từ một tập tin .m. –

+0

Tôi nên xác định 'cờ' ở đâu? Nó không có ý nghĩa trong tập tin .m? Tuy nhiên, tôi không thể tìm ra cú pháp cho nó. Thx – Nosrettap

+0

xác định thuộc tính trong lớp .m như bạn làm trong .h .. nó sẽ biến bool thành lớp không thể truy cập từ bên ngoài. – iphonic

Trả lời

21

Tôi cần phải tạo biến mẫu của loại BOOL với giá trị mặc định là FALSE trong một trong các lớp c mục tiêu của tôi. Làm thế nào để tôi làm điều này?

Giả sử bạn đang sử dụng Xcode hiện tại, bạn có thể khai báo Ivar trong việc thực hiện như thế này:

@implementation MyClass 
{ 
@private 
    BOOL myBool; 
} 

Tôi đã nhìn thấy mọi người định nghĩa nó trong file .h của họ nhưng tôi don' t thực sự cần biến này để được công khai.

Trước đây, bạn phải khai báo các biến mẫu trong @interface do cách thức các lớp được triển khai. Điều này hiện chỉ cần thiết nếu bạn đang nhắm mục tiêu đến 32 bit OS X.

Ngoài ra, tôi có nên biến nó thành tài sản không?

Điều đó tùy thuộc. Bạn chắc chắn sẽ làm cho nó trở thành một thuộc tính nếu nó là một phần của API bên ngoài của lớp của bạn (đối với các lớp không liên quan hoặc các lớp con để sử dụng. Nếu nó chỉ là một phần của trạng thái bên trong của đối tượng, bạn không cần biến nó thành thuộc tính (và I don ') t).

Hoặc tôi nên bao giờ không làm một cái gì đó một tài sản? Cảm ơn.

Nếu bạn không sử dụng ARC và loại là một loại đối tượng (BOOL không), bạn nên luôn luôn làm cho nó Nếu bạn bằng ARC, lời khuyên trong danh sách nhà phát triển của Apple là tạo nội dung là một phần của thuộc tính API và nội dung là trạng thái nội bộ dưới dạng ivars.

Lưu ý rằng, ngay cả đối với trạng thái nội bộ, bạn có thể muốn sử dụng KVO, trong trường hợp này, hãy sử dụng thuộc tính.

Nếu bạn khai báo BOOL này là tài sản và tổng hợp nó, bạn không cần phải khai báo rõ ràng ivar. Nếu bạn muốn làm cho tài sản "nhìn thấy" chỉ đến lớp đó, sử dụng một phần mở rộng lớp

@interface MyClass() 

@property (assign) BOOL myBool; 

@end 

@implementation MyClass 

@synthesize myBool = myBool_; // creates an ivar myBool_ to back the property myBool. 

@end 

Lưu ý rằng, mặc dù các trình biên dịch sẽ tạo ra cảnh báo cho ở trên, tại thời gian chạy, bất kỳ lớp có thể gửi setMyBool: hoặc myBool đối tượng của MyClass.

0

Nếu bạn đặt thuộc tính là công khai. Nếu bạn không muốn biến được công khai, hơn là không sử dụng thuộc tính. Tại sao bạn không muốn công khai? Bạn có thể có tài sản chỉ đọc và làm cho bạn có thể ghi trong .m thông qua một danh mục riêng tư.

Bạn có thể đặt nó trong file .m của bạn nếu bạn sử dụng iOS 5

@implementation MyClass { 
    BOOL _myBool; 
} 

Tôi nghĩ rằng đây là mới để iOS5. Nhưng tôi cũng đã thấy mã như thế này:

@implementation MyClass { 
@private 
    BOOL _myBool; 
} 

Hy vọng điều này sẽ hữu ích.

+0

"Nếu bạn đặt tài sản thành công khai". Trên thực tế, không. Thuộc tính có thể được khai báo riêng trong một phần mở rộng hoặc loại của lớp. – jlehr

+0

Nhưng nếu bạn không làm gì, chúng được công khai. – Pfitz

+0

Nếu bạn không làm gì cả, bạn không có gì. Điều gì xác định liệu một phương thức hay thuộc tính là công khai là nơi nó được khai báo. Nếu nó được khai báo trong tiêu đề, nó sẽ hiển thị công khai; nếu không thì không. (Không có thực thi thời gian chạy mặc dù.) – jlehr

2

BOOL được khai báo là iVars với đơn giản BOOL myBool và là thuộc tính với @property (nonatomic, assign) BOOL myBool. Lưu ý rằng, các giá trị BOOLean được khởi tạo thành NO (nil). Nếu bạn cần một BOOL để có thể truy cập từ các lớp khác, hoặc "toàn cục" trong tệp m, hãy sử dụng một iVar hoặc một thuộc tính, nếu không thì chỉ cần khai báo chúng như là các vlog được scoped theo một phương thức riêng lẻ.

+0

ivars BOOL khởi tạo YES? Bạn có muốn suy nghĩ lại câu nói đó không? – jrturton

+0

Bạn có tin ... Tự động sửa? – CodaFi

11

Nếu bạn muốn tạo biến riêng tư, bạn có thể sử dụng sức mạnh của các danh mục. Thực hiện một MyClass lớp ví dụ và trong file .m thực hiện như sau:

#import "MyClass.h" 

@interface MyClass() //This is an empty category on MyClass class 

@property (nonatomic, assign) BOOL myBool; 

@end 


@implementation MyClass 

@synthesize myBool = _myBool; 

-(void)myMethod { 
    self.myBool = YES; //this is using the property 
    _myBool = NO; //this is the instance variable, as @synthesize creates an instance variable for you 
    // both are private 
} 

@end 
1

Bạn có thể đặt việc kê khai trong hồ sơ .m.

Cho dù bạn tạo tài sản ra khỏi nó, phụ thuộc vào những gì bạn muốn. Là một tài sản, sau này bạn có thể áp dụng setter/getter bao gồm kiểm tra/bảo vệ/bất cứ điều gì. Ngoài ra, bạn có thể áp dụng khóa-giá trị truy cập.

Nếu bạn không cần một trong những điều này, không có nhu cầu thực sự cho một tài sản (nhưng một truyền thống tốt: bạn không bao giờ biết, làm thế nào mã của bạn sẽ phát triển).

0

tôi sử dụng 0, 1 thay YES, NO

#define YES 1 
#define NO 0 
Các vấn đề liên quan