0

標準のビュー コントローラーから UIDatePicker を使用して NSDate オブジェクトを設定するアプリケーションを構築しています。日付は、別のクラスの変更可能な辞書に追加されます。その同じクラスが日付オブジェクトにアクセスしようとすると、すべての割り当てが解除され、クラッシュが発生します。さらに、これは Xcode 5 でコンパイルしてからのみ問題になりました。

サンプルコード

@interface SomeViewController ()

@property (nonatomic, strong) UIDatePicker *datePicker;
@property (nonatomic, strong) ChangeTracker *changeTracker; // Records local changes made to managed objects to send to server

@end

@implementation SomeViewController

// Relevant implementation
- (void)touchSetPicker:(UIButton *)sender
{
    [self setDate:self.datePicker.date forManagedObject:self.someManagedObject];
}

- (void)setDate:(NSDate *)date forManagedObject:(NSManagedObject *)managedObject
{
    // Set properties on managed object based on date param

    // Pass date to changeTracker class
    [self.changeTracker setDate:date forManagedObject:managedObject];
}
@end

ChangeTracker.m

@interface ChangeTracker ()

@property (nonatomic, strong) NSMutableDictionary *dateChanges;

@end

@implementation ChangeTracker

- (void)setDate:(NSDate *)date forManagedObject:(NSManagedObject *)managedObject
{
    NSString *idProperty = managedObject.idProperty;

    self.dateChanges[idProperty] = date;
}

- (void)compileAllChanges
{
    for (NSString *idProperty in [self.dateChanges allKeys]) {

        // Here is where the crash occurs due to the date being deallocated
        NSDate *date = self.dateChanges[idProperty];
    }
}

@end

ゾンビ オブジェクトを有効にすると、次のエラー メッセージが表示されます: -[__NSDate release]: message sent to deallocated instance

プロジェクトは ARC を使用しているため、このオブジェクトを明示的に保持しようとすることはできません。どんな助けでも大歓迎です。

4

2 に答える 2

1

I am having the same problem described by @gabriel-ortega I am wondering if he had found any solution of what the cause was.

EDIT: To answer myself and hopefully help someone else too, I have found the cause of the problem.

As Apple documentation says:

To allow interoperation with manual retain-release code, ARC imposes a constraint on method naming: You cannot give an accessor a name that begins with new. This in turn means that you can’t, for example, declare a property whose name begins with new unless you specify a different getter:

// Won't work:
property NSString *newTitle;

// Works:
property (getter=theNewTitle) NSString *newTitle;

my property name was newPath so that explains...

于 2014-03-14T10:14:02.220 に答える
0

ARC を使用している場合、ゾンビは発生しません。弱い変数ではなく、unsafe_unretained として宣言された変数がありますか? または、どこかでサードパーティのライブラリを使用していますか? 手動で参照されたカウント コードを内部で使用するライブラリは、ゾンビの発生源になる可能性があります。

unsafe_unretained を不適切に使用すると、解放されたオブジェクトを参照する可能性がありますが、通常の強参照と弱参照では、弱参照は解放されるとすぐにゼロになります。リリースされました。

もう 1 つの可能性は、ブリッジ キャストの誤用です。それはARCを台無しにする可能性があります。ブリッジキャストを使用していますか?

于 2013-09-20T20:54:49.173 に答える