2009-03-18 46 views
8

Có lẽ một giải pháp rất đơn giản cho điều này nhưng tôi không thể làm cho nó hoạt động.Tôi làm cách nào để truy cập các biến từ một lớp khác?

Tôi có nhiều lớp trong tệp Cocoa của mình. Trong một trong các lớp class1 Tôi cũng tạo một biến mà tôi cần sử dụng trong một lớp khác là class2. Có cách nào đơn giản để nhập biến này trong class2?

+0

“Tôi có nhiều lớp trong tệp Cocoa.” Cách thông thường là tạo một cặp tệp (MyClass.h, MyClass.m) cho mỗi lớp. Bạn có thể thực hiện việc này bằng cách nhấp chuột phải vào một nhóm trong dự án và nhấp vào Thêm tệp. Bạn sẽ tạo ra .m, và .h sẽ xuất hiện miễn phí. –

+1

Truy cập trực tiếp các biến mẫu là một ý tưởng rất tồi. Sử dụng các thuộc tính và tổng hợp các trình truy cập hoặc viết của riêng bạn. Truy cập biến trực tiếp phá vỡ những thứ như KVO và các ràng buộc trên Mac OS X, và nó không thực hành tốt OO. – Alex

Trả lời

13

Bạn có thể biến biến thành công khai hoặc biến nó thành thuộc tính. Ví dụ, để làm cho nó công cộng:

@interface Class1 
{ 
@public 
    int var; 
} 
// methods... 
@end 

// Inside a Class2 method: 
Class1 *obj = ...; 
obj->var = 3; 

Để làm cho nó một tài sản:

@interface Class1 
{ 
    int var; // @protected by default 
} 
@property (readwrite, nonatomic) int var; 
// methods... 
@end 

@implementation Class1 
@synthesize var; 
... 
@end 

// Inside a Class2 method: 
Class1 *obj = ...; 
obj.var = 3; // implicitly calls [obj setVar:3] 
int x = obj.var; // implicitly calls x = [obj var]; 
+2

Cách tiếp cận tài sản tốt hơn nhiều, IMHO – Abizern

6

Bạn có thể phơi bày các biến trong class2 như một tài sản. Nếu class1 có tham chiếu đến class2, class1 có thể thấy biến đó. Thành thật mà nói, có vẻ như bạn là người mới bắt đầu cho cả Objective-C và lập trình hướng đối tượng. Tôi khuyên bạn nên đọc thêm trên cả hai.

Here is a place để bắt đầu lập trình hướng đối tượng với Mục tiêu-C.

+3

Chỉ là "stackoverflow.com" cho người dùng nâng cao? Làm thế nào để xác định ai là người mới bắt đầu, và ai không.Anh chàng không đưa ra câu hỏi để tìm hiểu mục tiêu-C. –

+3

Thực sự đồng ý với @DariusMiliauskas: P – preetam

3

hãy thử tạo một tệp chứa các biến cần phải được truy cập trong suốt ứng dụng.

extern NSString *stringVariable; 

@interface GlobalVariables 

@property (retain, nonatomic) NSString *stringVariable;  

@end 

và trong file GlobalVariables.m thêm

#import "GlobalVariables.h" 

@implements GlobalVariables 

@synthesize stringVariable; 

NSString *stringVariable; 

@end 

Và sau đó miễn là bạn nhập GlobalVariables.h vào các tập tin bao giờ .m bạn cần truy cập mà biến trong bạn có thể gán và truy cập bất cứ nơi nào trong suốt chương trình của bạn.

EDIT

câu trả lời của tôi mà tôi đã đưa ra ở trên là khác nhau không phải là cách tôi sẽ đi về việc này ngay bây giờ. Nó sẽ được nhiều hơn như

@interface MyClass 

@property (nonatomic, strong) NSString *myVariable; 

@end 

sau đó trong file .m

@implementation MyClass 

@sythesize = myVariable = _myVariable; // Not that we need to do this anymore 

@end 

Sau đó, trong một lớp học trong một số phương pháp tôi sẽ phải

// ..... 
MyClass *myClass = [[MyClass alloc] init]; 
[myClass setMyVariable:@"My String to go in my variable"]; 
// ..... 
1

Trong "XCode" bạn cần tạo nhập, tạo đối tượng bằng cách khai báo nó làm thuộc tính, và sau đó sử dụng cú pháp "object.variable". Tệp "Class2.m" sẽ trông giống như sau:

#import Class2.h 
#import Class1.h; 

@interface Class2() 
... 
@property (nonatomic, strong) Class1 *class1; 
... 
@end 

@implementation Class2 

//accessing the variable from balloon.h 
...class1.variableFromClass1...; 

... 
@end 

Cảm ơn! :-)

Các vấn đề liên quan