委托模式中的变量丢失值

时间:2015-05-24 18:22:40

标签: objective-c delegates

我正在尝试了解Objective-C中的委托,并且在转移过程中丢失数据的变量存在一个小问题。我的Class1包含$("#FormId").validate().element('#FieldId'); 。数组被填充,然后我想将数组的值传递给Class2,并显示它。以下是Class1中的相关代码:

NSMutableArray

现在,这就是我在Class2中所拥有的:

 //Class1.h
 @class Class1;
 // define the protocol for the delegate
 @protocol Class1Delegate

 @required
 -(void)sayHello:(Class1 *)customClass withAntArray:(NSMutableArray *)antArray;

 @end

 @interface Class1 : MySuperClassName

 @property (nonatomic, assign) id delegate;

 -(void)helloDelegate;

 @end


    //Class1.m:
@interface Class1 ()
@property (nonatomic, strong) NSMutableArray *antOccurenceTimes;
@end
@implementation Class1
@synthesize antOccurenceTimes;

-(void)helloDelegate
{
    // send the message to the delegate


 [_delegate sayHello:self withAntArray:self.antOccurenceTimes];
}

#import "Class1.h" @interface Class2 : UIView <Class1Delegate> @end // Class2.m: - (void)appropriateTimeToCallMethod { Class1 *initAntMarks = [[Class1 alloc] init]; initAntMarks.delegate = self; [initAntMarks helloDelegate]; } -(void)sayHello:(Class1 *)customClass withAntArray:(NSMutableArray *)antArray { NSLog(@"Hello! %@", antArray.description); } 读为“NULL”。现在,我认为它显然是null,因为我只是在调用所需方法之前创建了一个全新的类实例。我觉得我可能有些混淆,对代表团这么新,我不确定到底是什么。有谁知道我需要调整以利用代表团? 我忘了添加我在Class1中初始化它,并且它填充得很好。这种情况只发生在第二阶段。

我在下面的代码段中的ClassA中的单独方法中初始化antOccuranceTimes,并且NSLog会触发两次......

antArray.description

2 个答案:

答案 0 :(得分:1)

您尚未初始化antOccurenceTimes。因为它是零。根据您的需要,有很多选择。例如,您可以在init函数中初始化它:

- (instancetype)init {
    self = [super init];
    if( self ) {
        antOccurenceTimes = [NSMutableArray array];
        [antOccurenceTimes addObject:@"Hello World"];
    }
}

或者在调用委托函数之前初始化它。

-(void)helloDelegate
{
    // send the message to the delegate

    self.antOccurenceTimes = [NSMutableArray array]; 
    [self.antOccurenceTimes addObject:@"Hello World"];
    [_delegate sayHello:self withAntArray:self.antOccurenceTimes];
}

我想你明白我的观点。

答案 1 :(得分:1)

更改此行:

@property (nonatomic, assign) id delegate;

到:

@property (nonatomic, weak) id <Class1Delegate> delegate;

assign应仅用于C基元,而不是Objective-c对象引用。在传递委托之前,您还应该检查您的对象是否实际符合委托。

修改

我认为你可能会对代表团的目的感到困惑。

Class1 *initAntMarks = [[Class1 alloc] init];
initAntMarks.delegate = self;
[initAntMarks helloDelegate];

为什么在一个对象上调用一个方法,当你只需创建一个返回NSMutableArray的方法时,该方法又调用一个委托方法?当前设置代码的方式要求在调用-helloDelegate之前,必须使用适当的对象填充数组。 MVC中委托的目的是通知对象发生在另一个对象内部的事件。您将任务“委托”给另一个对象,或者您可以说,另一个对象是否负责完成任务。阅读Apple Docs on Delegation。代码中的委托不是正确的实现模式,正如我所说,你可以简单地通过方法调用返回该数组。

编辑2:

通过属性方法或通过返回数组的显式方法,有两种方法可以实现此目的。如果选择使用属性方法,则属性声明必须位于公共接口(即.h文件中),以便在实现对象时,您的类可以使用所有访问器。

//Inside the .h
@property (nonatomic, strong) NSMutableArray *antOccurenceTimes;

这将自动为您提供antOccurenceTimes属性的两种访问方法。这些是getter -antOccurenceTimes和setter -setAntOccurenceTimes:方法。现在,在初始化类并填充数组后,您可以调用-antOccurenceTimes来返回数组。

您还可以创建一个返回数组的显式方法:

- (NSMutableArray *)hello{

    //Do something here
    return _antOccurenceTimes;

}