2010-04-01 27 views
6

Bạn đang xem xét điều này một chút và không hiểu tại sao mã bit đơn giản này lại ném một lỗi. Được rút ngắn cho ngắn gọn:Thêm chuỗi vào NSMutableString

NSMutableString *output; 

... 

@property (nonatomic, retain) NSMutableString *output; 

... 

@synthesize output; 

... 

// logs "output start" as expected 
output = [NSMutableString stringWithCapacity:0]; 
[output appendString:@"output start"]; 
NSLog(@"%@", output); 

... 

// error happens here 
// this is later on in a different method 
[output appendString:@"doing roll for player"]; 

Có ai phát hiện ra lỗi của tôi không?

+0

Lỗi chính xác là gì? – outis

Trả lời

1

Giải pháp trên thực tế phải thực hiện với lưu giữ, như được chỉ ra bởi người dùng invariant. Phương thức lớp học:

output = [NSMutableString stringWithCapacity:0]; 

trả về số autorelease NSMutableString. Khi được gán cho thuộc tính đầu ra của tôi - dường như, ngay cả với cờ giữ lại - nó đã không giữ lại nó. Giải pháp là tự phân bổ và không tự động trả lại:

output = [[NSMutableString alloc] initWithCapacity:0]; 

Sau đó, việc lưu giữ đã hoạt động. Bất kỳ lời giải thích nào về lý do tại sao sẽ rất được hoan nghênh.

Sửa

đặn hiểu tại sao. Tôi đã truy cập trực tiếp các vars cá thể thay vì thông qua bộ thu thập dữ liệu/setter mà tôi tổng hợp. Thông tin thêm về số blog của tôi.

+0

Rufus từ AppleDevForums đã cho tôi một câu trả lời khá tốt cho một điều tương tự: – Emil

+1

Nó cực kỳ khó hiểu, và 7 hoặc 8 điều bạn cần biết để cuối cùng có ý nghĩa không ở cùng một nơi. Đầu tiên, hãy tin tưởng rằng 'self.foo = bar;' là điều tương tự như (một lối tắt cú pháp cho) '[self setFoo: bar];' Namely, "gọi phương thức" 'setFoo: bar'" về tôi (đối tượng này). " Bây giờ bạn sẽ tự hỏi mình, "Huh? Tôi không viết bất kỳ phương thức" setFoo "nào." Đúng, bạn đã không. Chỉ thị @synthesize nói với trình biên dịch để viết phương thức "setFoo". – Emil

+0

Và trình biên dịch không cung cấp cho bạn mã nguồn của phương pháp này mà nó đã viết cho bạn. Nhưng phương thức "setFoo:" ẩn này làm gì? 1. Nó kiểm tra xem "bar" đã được đặt thành "foo" chưa. 2. Nếu không, nó sẽ gửi thông báo "release" tới "foo" 3. Nó đặt con trỏ "foo" thành con trỏ "bar" 4. Nó sẽ gửi thông điệp "giữ lại" tới "foo" (NẾU @property chỉ thị cho "foo" nói để làm như vậy). – Emil

2

Thay đổi dòng

output = [NSMutableString stringWithString:@"output start"]

để

[self setOutput:[NSMutableString stringWithString:@"output start"]]

(hoặc self.output = ... nếu bạn thích rằng ký hiệu).

Mặc dù bạn đã khai báo một thuộc tính, bạn không sử dụng trình thiết lập, vì vậy bạn không giữ lại chuỗi.

+0

Thật sao? Huh, rất vui được biết. Tôi nghĩ khi tôi @giảm một biến nó làm điều đó cho tôi. – typeoneerror

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