Tôi đang dần tự dạy ca cao cho iPhone (thông qua Stanford Class on iTunes U) và tôi đã trải qua một phần về quản lý bộ nhớ, và tôi hy vọng sẽ nhận được một số xác nhận rằng các giả định Tôi đang làm cách xử lý bộ nhớ và cách [release] và [autorelease] hoạt động. Vì quản lý bộ nhớ là một phần thực sự cơ bản và cơ bản nhưng rất cần thiết của trải nghiệm lập trình, tôi muốn đảm bảo rằng tôi đang làm đúng.phát hành/autorelease nhầm lẫn trong ca cao cho iphone
Tôi hiểu rằng bất kỳ điều gì có phân bổ, mới hoặc bản sao cần phải được phát hành.
Nếu tôi làm điều này:
NSString *temp = [[NSString alloc] initWithString:@"Hello World"];
Sau đó, tôi cần phải thêm [tạm thời phát hành/autorelease] cuối cùng, vì tôi có một alloc.
Tuy nhiên, nếu tôi làm điều này:
NSString *temp = @"Hello World";
Sau đó, nó dường như không cần một tuyên bố phát hành. Lớp NSString có tự động gọi tự động là một phần của bài tập không?
Ngoài ra, có sự khác biệt nào giữa hai đối tượng * tạm thời ở đây sau các câu lệnh này không? Cả hai đều chứa cùng một chuỗi, nhưng có cách sử dụng bộ nhớ/cách sử dụng chúng khác nhau không?
Thứ hai, với các thuộc tính, tôi giả sử rằng tự động xử lý tự động được xử lý. Nếu tôi có điều này:
@interface Person : NSObject
{
//ivars
NSString *firstName;
NSString *lastName;
}
//properties
@property NSString *firstName;
@property NSString *lastName;
///next file
@implementation Person
@synthesize firstName;
@synthesize lastName;
- (void) dealloc
{
//HERE!!!!
[super dealloc];
}
tôi giả sử tôi không cần phải thêm [firstName phát hành] và [lastName phát hành] (tại // ĐÂY !!!!), vì đó là tự động xử lý bởi các thuộc tính . Đúng không?
Tôi hiểu rằng nếu tôi làm điều này trong mã (giả sử tôi đã xác định initWithFirstName):
Person *Me = [[Person alloc] initWithFirstName: @"Drew", lastName:"McGhie"];
mà sau này tôi sẽ phải sử dụng [Me phát hành/autorelease];
Bất kỳ trợ giúp nào xác nhận hoặc chỉnh sửa sự hiểu biết của tôi cho đến nay đều được đánh giá cao.
POST ĐÁP VIẾT-UP
tôi nghĩ rằng tôi muốn viết những dòng này tất cả lên sau khi đi qua tất cả các câu trả lời và kiểm tra ra những gợi ý và nói về những gì đã làm việc.
Tôi cần thêm [firstName release], [lastName release], nhưng tôi cũng cần thêm (giữ lại) vào mô tả thuộc tính. Không thêm cảnh báo (giữ lại) gây ra bởi vì nó giả định (gán). Đây là cách cuối cùng tôi thiết lập lớp học
@interface Person : NSObject
{
//ivars
NSString *firstName;
NSString *lastName;
}
//properties
@property (retain) NSString *firstName;
@property (retain) NSString *lastName;
///next file
@implementation Person
@synthesize firstName;
@synthesize lastName;
- (void) dealloc
{
[firstName release];
[lastName release];
[super dealloc];
}
Tôi không phân bổ/sao chép/giữ lại firstName hoặc lastName một cách rõ ràng. Có cần thiết vì phân bổ được phỏng đoán bằng cách tạo tự động tổng hợp mà tôi không thấy trong mã? –
Theo nghĩa nào đó. Vấn đề ở bàn tay là đối tượng của bạn "sở hữu" 'firstName' và' lastName', vì vậy khi chúng được thiết lập, bạn sẽ có trách nhiệm giải phóng chúng. –