2009-04-04 58 views
5

Tôi có thuộc tính thay đổi thành không hợp lệ khi tôi di chuyển giữa viewDidLoad và viewWillAppear. Tôi không biết tại sao điều đó lại xảy ra.Tại sao thuộc tính NSString thay đổi thành giá trị không hợp lệ?

Tôi có một lớp trợ giúp có đường dẫn đến cơ sở dữ liệu của tôi. Tôi phân bổ lớp này trong ủy nhiệm ứng dụng. RootViewController được một tham chiếu đến appdelegate như thế này:

//inside .h file 
@interface RootViewController : UITableViewController 
<UITableViewDelegate, UITableViewDataSource>{ 
NSArray *controllers; 
myAppDelegate *appDelegate; 
} 

//inside .m file 
@implementation RootViewController 
@synthesize controllers; 

- (void)viewDidLoad { 
appDelegate = [[UIApplication sharedApplication] delegate]; 

self.controllers = appDelegate.topicControllers; 
[super viewDidLoad]; 
} 

Tôi chuột lên appdelegate để tìm thấy những lớp cơ sở dữ liệu helper và tài sản có chứa các đường cơ sở dữ liệu:

NSPathStore2 * appDelegate.databaseHeper.databasePath "/Users/userA/Library/Application Support/iPhone Simulator/User/Applications..." 

DatabasePath được khai báo một NSString. Tại sao nó thay đổi thành NSPathStore2?

Khi tôi tiếp tục trong trình gỡ lỗi, một số điều kỳ lạ khác sẽ xảy ra. Khi tôi nhận được trong viewWillAppear, giá trị thuộc tính trở thành "không hợp lệ" và loại trở lại NSString. Mặc dù tôi đã nhìn thấy UIButton trong đó.

Tại sao nó thay đổi thành không hợp lệ? Tôi không thể sử dụng biến nữa.

- (void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; //changes before this line executes 
} 

Tôi không làm gì giữa viewDidLoad và viewWillAppear. Sau đây là cách DatabasePath được gán trong lớp databaseHelper, mà xảy ra trước đây về applicationDidFinishLaunching:

- (NSString *) getDBPath { 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
NSString *documentsDir = [paths objectAtIndex:0]; 
return [documentsDir stringByAppendingPathComponent:self.databaseName]; 
} 

stringByAppendingPathComponent trả về một NSString. Tại sao tôi nhận được một NSStorePath2 đôi khi xuống đường sau khi chuyển nhượng?

Tôi có mọi thứ đang hoạt động mà không gặp vấn đề gì nhưng chỉ cần gọi [databaseHelper getDBpath]. Mục tiêu của tôi là để tiết kiệm một số chu kỳ CPU và lưu trữ giá trị đó. Do đó databasePath. Bất kỳ đề xuất nào tại sao databasePath thay đổi thành không hợp lệ?

+0

Tại sao lại là downvotes? Đây là một câu hỏi tốt hơn là một số lượng tốt các câu hỏi nghèo mà nhận được tấn upvotes! –

Trả lời

5

Vì bạn chưa giữ lại giá trị. Xem lại các quy tắc trong Memory Management Programming Guide để xem khi nào bạn cần giữ lại một số thứ.

Tất nhiên, như ghi chú cdespinosa, có thể bạn không cần phải lưu lại tên đường dẫn này ngay từ đầu. Nó có lẽ không phải là một kẻ giết người hiệu suất lớn. Hồ sơ đầu tiên, rồi tối ưu hóa các điểm nóng.

+0

Làm thế nào bạn có thể suy ra tôi không giữ lại khi triển khai thực hiện cho databasePath chưa được hiển thị? Đây là việc thực hiện: @property (nonatomic, giữ lại) NSString * databasePath; – 4thSpace

+1

Vì đó là nguyên nhân gây ra triệu chứng đó. Hoặc là đối tượng của bạn đã chết (bởi vì bạn không giữ lại nó) hoặc bạn thay thế nó bằng một cái khác (và không giữ lại nó). Hoặc bạn đã phát hành nó quá mức, nhưng ít có khả năng hơn. Đối với @property: Bạn có thực sự đang sử dụng thuộc tính hoặc chỉ định trực tiếp cho ivar không? –

+0

>> ... hoặc gán trực tiếp cho ngà? << Đó là vấn đề. Trong databaseHelper, tôi đã chỉ định databasePath thay vì self.databasePath. Sau đó giữ lại giá trị. Có gì khác biệt? Và cảm ơn! – 4thSpace

3

Tôi tin rằng bạn có nghĩa là NSPathStore2, không phải NSStorePath.

NSPathStore2 nằm trong lớp con riêng tư bên trong của NSString được sử dụng giữa các hệ thống phụ nơi chuỗi được biết là đường dẫn hệ thống tệp. Đó là chức năng tương đương với một NSString trong tất cả các cách bạn sẽ quan tâm.

Nó không rõ ràng từ bài viết của bạn cho dù bạn có bất kỳ vấn đề khác hơn là tự hỏi những gì lớp đó là, và cho dù có bất kỳ tối ưu hóa để đạt được bằng cách bộ nhớ đệm nó. Câu trả lời có lẽ không phải là: tất cả những thứ sử dụng chu trình CPU khi truy cập cơ sở dữ liệu, việc truy cập vào đường dẫn hệ thống tập tin của nó có lẽ sẽ là cuối cùng trong danh sách.

+0

Tôi không hiểu đoạn cuối của bạn hoặc lý do bạn tin rằng giá trị của bạn biến thành không hợp lệ không phải là vấn đề. Tôi đã chỉnh sửa bài đăng để hy vọng rõ ràng hơn. Không chắc chắn tại sao có một phiếu bầu -1. – 4thSpace

+0

Nó không trở thành không hợp lệ. Nó không biến thành bất cứ thứ gì. “NSPathStore2 là [an] lớp con riêng tư bên trong của NSString” —i.e., Đối tượng * là * một NSString.Nó không phải là một cá thể trực tiếp của NSString; đó là một trường hợp của một phân lớp, đó là đủ tốt. Chỉ cần xử lý nó như bạn sẽ bất kỳ NSString khác. –

+0

Vấn đề là tôi đang mong đợi một đường dẫn trong databaePath. Nhưng thay vào đó nhận được một giá trị "không hợp lệ" khi có sử dụng để được một con đường. Vì lý do gì, giá trị đường dẫn biến mất. Bạn tiếp tục đưa ra các định nghĩa về NSString và NSPathStore2, đó không phải là những gì tôi yêu cầu. – 4thSpace

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