2010-03-11 31 views
10

Tôi muốn thay đổi giá trị biến là thành viên của cấu trúc của một lớp khác. Nhưng giá trị không bị thay đổi.Cocoa Objective-c Phân bổ cấu trúc C thuộc tính không thành công

Đây là mã.

//Structure.. 

typedef struct { 
    int a; 
    double b; 
} SomeType; 


//Class which has the structure as member.. 
@interface Test2 : NSObject { 
    // Define some class which uses SomeType 
    SomeType member; 

} 

@property SomeType member; 

@end 


@implementation Test2 

@synthesize member; 

@end 


//Tester file, here value is changed.. 
@implementation TesstAppDelegate 

@synthesize window; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    // Insert code here to initialize your application 

    Test2 *t = [[Test2 alloc]init]; 

    t.member.a = 10; 
//After this the value still shows 0 

} 

@end 

Tôi đã thử với liên kết dưới đây.

Structure as a class member in Objective C

Kính trọng, Dhana.

Trả lời

22

Để thay đổi biến đối tượng 'thành viên' của bạn, bạn cần phải đặt toàn bộ. Bạn nên làm điều gì đó như:

SomeType mem = t.member; 
mem.a = 10; 
t.member = mem; 

Vấn đề là t.member đang được sử dụng như là một "getter" (vì nó không phải ngay lập tức sau đó là một '='), vì vậy t.member.a = 10; cũng giống như [t member].a = 10;

Điều đó sẽ không thực hiện bất cứ điều gì, bởi vì [t member] trả về một cấu trúc, đó là "giá trị r", tức là. một giá trị chỉ hợp lệ để sử dụng ở phía bên tay phải của bài tập. Nó có giá trị, nhưng vô nghĩa khi cố gắng thay đổi giá trị đó.

Về cơ bản, t.member đang trả về bản sao cấu trúc 'thành viên' của bạn. Sau đó, bạn ngay lập tức sửa đổi bản sao đó và ở cuối phương thức mà bản sao bị hủy.

+0

Ồ, 't.member.a' chỉ tốt cho _reading_ giá trị của' member.a'. Nó chính xác giống như '[t member] .a'. –

+0

Vâng, nó hoạt động tốt .. Tôi đã cố gắng làm mọi thứ trong một bước .. – Dhanaraj

+1

Bạn có biết âm thanh đó là gì không, độ cao? Đó là những nhà phát triển C# đáng sợ. Nếu bạn không tin tôi, chỉ cần chờ đợi. Chúng luôn lớn hơn khi chúng sử dụng ký hiệu chấm trong Objective-C! http://www.youtube.com/watch?v=Tfo3nEZHNLk – Steve

4

Thực hiện một con trỏ đến cấu trúc của bạn thay vào đó, sau đó chỉ cần dereference nó khi bạn muốn thay đổi một phần của nó.

Ví dụ:

struct myStruct { 
    int a, 
     b; 
}; 

@interface myClass : NSObject { 
myStruct *testStruct; 
} 

@property myStruct *testStruct; 

Sau đó, để thay đổi một phần của mystruct chỉ làm myClassObject.testStruct->a = 55;

1

Thay đổi dòng tổng hợp để:

@synthesize member = _member;

Sau đó, bạn có thể gán giá trị trong một dòng của mã:

_member.a = 10;

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