2010-11-04 38 views
6

Rõ ràng, với obj-c, thường không có lý do để viết getters và setters (nhờ hữu ích mr @synthesize).Viết getter và setter cho biến BOOL

Vì vậy, bây giờ, cần phải làm điều này, tôi đã gặp vấn đề mà tôi không biết cách viết chúng. : p

Tôi chắc chắn tôi sẽ không giải quyết vấn đề của mình đúng cách - sẽ dễ dàng hơn khi chỉ phân lớp đối tượng của tôi và như vậy - nhưng tôi đang cố viết mã danh mục để thêm thuộc tính vì (Ban đầu) nó nhanh hơn và bởi vì tôi muốn tìm hiểu cách sử dụng mã danh mục trong ứng dụng của mình.

Tôi đã có này:

-(BOOL)isMethodStep { 
    return self.isMethodStep; 
} 

-(void)setIsMethodStep:(BOOL)theBoolean { 
    if(self.isMethodStep != theBoolean){ 
     self.isMethodStep = theBoolean; 
    } 
} 

và tôi đã thử nó mà không có sự nếu truy vấn trong setter, nhưng không có vẻ làm việc. Tải nó với các điểm ngắt cho thấy rằng vì một số lý do nó bị kẹt trong một vòng lặp liên tục trong phương thức getter.

Mã này đúng hay tôi đang làm điều gì đó sai?

Cảm ơn Tom

Trả lời

11

Trong

-(BOOL)isMethodStep { 
    return self.isMethodStep; 
} 

return self.isMethodStep; gọi phương thức isMethodStep tương tự gây ra vòng lặp vô hạn. Điều tương tự cho setter.

Chỉ cần sử dụng Ivars của bạn trực tiếp trong việc triển khai phương pháp accessor của bạn:

-(BOOL)isMethodStep { 
    return isMethodStep; 
} 

-(void)setIsMethodStep:(BOOL)theBoolean { 
    if(isMethodStep != theBoolean){ 
     isMethodStep = theBoolean; 
    } 
} 
+0

vâng, tôi đã đoán. :) nhưng, làm cách nào để ngăn điều này xảy ra? Làm thế nào để viết chúng? –

+0

- (BOOL) isMethodStep { return isMethodStep; } – superfell

+0

Tôi đã chỉnh sửa câu trả lời của mình, tôi cho rằng các phương pháp sẽ trông giống như vậy (nếu bạn không quan tâm đến nguyên tử, tôi không giỏi về vấn đề luồng ...) – Vladimir

3

Bạn không muốn sử dụng cú pháp self. tài sản trong setter/getter, bởi vì đó gọi setter/getter một lần nữa, thay vì trực tiếp gán cho biến.

Bạn cần phải chỉ nói:

-(BOOL)isMethodStep { 
    return isMethodStep; 
} 

-(void)setIsMethodStep:(BOOL)theBoolean { 
    isMethodStep = theBoolean; 
} 

(giả sử "isMethodStep" là tên của biến của bạn). Tôi cũng sẽ bỏ qua bài kiểm tra trong phương thức setter ...

+1

Tôi nhận được rằng 'isMethodStep là undeclared'. :/ –

+0

cùng một vấn đề. Đặt '_isMethodStep' – WebOrCode

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