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ó.
Hiển thị mã của bạn về BWBirdSightingDataController –
@AttilaH thêm nó – rednaw
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