2013-05-31 34 views
6

Khóa của một mảng được đặt trên thuộc tính trên đối tượng khác (dataController trong BWMasterViewController) với tham chiếu mạnh trở thành null. Tôi không hiểu tại sao.Thuộc tính đối tượng có tham chiếu mạnh trở thành rỗng

BWMasterViewController

tiêu đề:

#import <UIKit/UIKit.h> 

@class BWBirdSightingDataController; 

@interface BWMasterViewController : UITableViewController 
@end 

thực hiện:

#import "BWMasterViewController.h" 
#import "BWBirdSightingDataController.h" 
#import "Bird.h" 
#import "BWWebviewController.h" 

@interface BWMasterViewController() 
@property (strong, nonatomic) BWBirdSightingDataController *dataController; 
@property (copy, nonatomic) NSString *test; 
@end 

@implementation BWMasterViewController 

- (void)awakeFromNib 
{ 

    [super awakeFromNib]; 

    NSLog(@"awake from nib"); 
    self.dataController = [[BWBirdSightingDataController alloc] init]; 
    self.test = @"Test var"; 

    NSLog(@"test: %@", self.test); 
    Bird *bird = [self.dataController objectInListAtIndex:0]; 
    NSLog(@"bird object: %@", bird); 
    NSLog(@"bird name: %@", bird.name) 

} 

- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 

    NSLog(@"view did load"); 

    NSLog(@"test: %@", self.test); 
    Bird *bird = [self.dataController objectInListAtIndex:0]; 
    NSLog(@"bird object: %@", bird); 
    NSLog(@"bird name: %@", bird.name) 

} 

// .... 

BWBirdSightingDataController

tiêu đề:

#import <Foundation/Foundation.h> 

@class Bird; 

@interface BWBirdSightingDataController : NSObject 
- (NSUInteger)countOfList; 
- (Bird *)objectInListAtIndex:(NSUInteger)theIndex; 
@end 

thực hiện:

#import "BWBirdSightingDataController.h" 
#import "BWDataController.h" 
#import "Bird.h" 

@interface BWBirdSightingDataController() 
-(void)initializeDefaultDataList; 
@property (nonatomic, copy) NSMutableArray *birds; 
@end 

@implementation BWBirdSightingDataController 

- (id)init 
{ 

    if (self = [super init]) { 
     [self initializeDefaultDataList]; 
     return self; 
    } 

    return nil; 

} 

- (void)initializeDefaultDataList 
{ 

    BWDataController *dataController = [[BWDataController alloc] init]; 

    NSEntityDescription *birdsEntity = [NSEntityDescription 
             entityForName:@"Bird" 
             inManagedObjectContext:dataController.managedObjectContext]; 
    NSFetchRequest *fetchBirds = [[NSFetchRequest alloc] init]; 
    [fetchBirds setEntity:birdsEntity]; 

    NSError *fetchError = nil; 
    NSArray *birdsObjects = [dataController.managedObjectContext 
          executeFetchRequest:fetchBirds 
          error:&fetchError]; 
    self.birds = [birdsObjects mutableCopy]; 

} 

- (NSUInteger)countOfList 
{ 
    return [self.birds count]; 
} 

- (Bird *)objectInListAtIndex:(NSUInteger)theIndex 
{ 
    return self.birds[theIndex]; 
} 

@end 

Bird

Bird là một NSManagedObject dựa trên một CoreData Entity.

tiêu đề:

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 


@interface Bird : NSManagedObject 

@property (nonatomic, retain) NSDate * date; 
@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSString * location; 
@property (nonatomic, retain) NSString * image; 
@property (nonatomic, retain) NSString * url; 

@end 

thực hiện:

#import "Bird.h" 


@implementation Bird 

@dynamic date; 
@dynamic name; 
@dynamic location; 
@dynamic image; 
@dynamic url; 

@end 

Output

Khi tôi chạy nó, điều này quả đầu ra:

2013-05-31 11:36:47.824 BirdWatching[69565:c07] awake from nib 
2013-05-31 11:36:47.834 BirdWatching[69565:c07] test: Test var 
2013-05-31 11:36:47.834 BirdWatching[69565:c07] bird object: <Bird: 0x8545ec0> (entity: Bird; id: 0x8545040 <x-coredata://D24A664F-8E8F-4AF0-891C-098C8A7DD860/Bird/p1> ; data: <fault>) 
2013-05-31 11:36:47.835 BirdWatching[69565:c07] bird name: Pigeon 
2013-05-31 11:36:47.839 BirdWatching[69565:c07] view did load 
2013-05-31 11:36:47.840 BirdWatching[69565:c07] test: Test var 
2013-05-31 11:36:47.840 BirdWatching[69565:c07] bird object: <Bird: 0x8545ec0> (entity: Bird; id: 0x8545040 <x-coredata://D24A664F-8E8F-4AF0-891C-098C8A7DD860/Bird/p1> ; data: <fault>) 
2013-05-31 11:36:47.840 BirdWatching[69565:c07] bird name: (null) 

Như bạn có thể thấy, trongChức năng 210 bird.name đã trở thành null. Làm thế nào mà? Tôi tuyên bố tài sản là một tài liệu tham khảo mạnh mẽ.

Tôi có cùng một vấn đề khi tôi xác định self.dataController trong viewDidLoad, sau đó nó sẽ là rỗng trong prepareForSegue, nơi tôi cũng cần đến nó.

+0

Hiển thị mã của bạn về BWBirdSightingDataController –

+1

@AttilaH thêm nó – rednaw

+0

Thêm nhật ký hoặc sử dụng trình gỡ lỗi để xem qua mã của bạn. Thường xuyên kiểm tra nếu 'self.birds' không phải là không.Tôi nghi ngờ rằng toàn bộ mảng trở nên không hợp lệ. – Till

Trả lời

8

Bạn tạo các đối tượng Bird trong initializeDefaultDataList bằng cách sử dụng địa phương BWDataController *dataController. dataController được tự động deallocated ở phần cuối của phương pháp này, có thể có nghĩa là bối cảnh đối tượng quản lý dataController.managedObjectContext cũng không còn tồn tại.

Tuy nhiên, đối tượng được quản lý chỉ có thể sống trong ngữ cảnh được tạo. Nếu ngữ cảnh bị hủy thì chính xác điều đó xảy ra: Truy cập tất cả thuộc tính trả về nil.

giải pháp có thể:

  • Hãy dataController một tài sản mạnh mẽ của BWBirdSightingDataController thay vì một biến địa phương.
  • Sử dụng bối cảnh đối tượng được quản lý được chia sẻ trên ứng dụng.
+0

Ok, đủ công bằng. Vậy làm thế nào tôi có thể giữ lại các đối tượng 'Chim' này trong thuộc tính' chim' của tôi? Tôi đã nghĩ rằng tôi có thể có 'BWBirdSightingDataController' quản lý giao tiếp với Core Data, an toàn dữ liệu cần thiết trong nội bộ và phục vụ nó cho' BWMasterViewController'. Làm thế nào tôi sẽ đi về điều đó? – rednaw

+0

@rednaw: Xem câu trả lời cập nhật. –

+0

Vâng, tôi đã tạo ra 'dataController' một tài sản mạnh mẽ, bây giờ nó hoạt động! Cảm ơn! – rednaw

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