0

我已将一个按钮链接到以下方法:

- (IBAction)searchButton
{
    NSString *searchText = _searchField.text;
    NSLog(@"lol");
    [_search testSearch:searchText];
}

最后一行在名为 search 的对象中调用 testSearch 方法,定义如下:

@property (strong, nonatomic) Search *search;

在 Search 中,testSearch 定义如下:

-(void)testSearch:(NSString *)testString
{
    NSLog(@"HELLO");
}

当我点击搜索时,我的最终输出只有“lol”(每次我点击按钮)。它不会像 testSearch 那样打印“HELLO”。我在 Search.h 中包含了 testSearch,所以它应该是可以访问的……为什么不调用这个方法?

4

2 回答 2

6

您应该首先将您的_searchivar 初始化为您指定的初始化程序中的一个实例Search(或在viewDidLoad或其他一些“用户将使用此方法”中)。

- init {
   if ((self = [super init])) {
       _search = [[Search alloc] init];
   }
   return self;
}

出于多种原因,您通常应该避免在 getter 方法中进行延迟初始化:

  • 它添加了不必要的代码;使用@property和默认的合成实现。导致更简单的代码和更少的代码。

  • 进行惰性初始化的 getter 会产生导致突变的 getter。这是不一致的,在调用 getter时看到 KVO 更改通知是很奇怪的(当然,除非您没有触发 KVO 通知......此时,您有不可观察的突变)。

  • 导致突变的吸气剂本质上不是线程安全的,除非您添加代码,棘手的代码,以使其如此。

  • 延迟初始化通常是过早的优化。除非您“过早”初始化资源而导致可识别的内存或 CPU 性能问题,否则添加延迟初始化的复杂性是浪费精力。

  • 延迟初始化会导致奇怪的排序依赖和其他复杂性。拥有一个已知的初始化子系统的入口点比依赖子系统 X 在 Y 之前初始化要好得多,两者都有副作用。

于 2013-06-13T20:50:17.767 回答
0

您要向其发送消息的搜索对象尚未实例化,因此您要向 nil 发送消息。在 Obj-C 中,这不会使程序崩溃,而是什么都不做。在 iVar 的 getter 方法中执行惰性实例化是 Objective-C 编程中的最佳实践。此外,您必须将此最佳实践与不直接访问您的 iVar 结合起来,并为您尝试访问的任何 iVar 使用 setter 和 getter。下面是搜索 iVar 的 getter 方法中延迟实例化的示例:

-(Search *)search
{
     if(!_search){
        _search = [[Search alloc]init];
     }
     return _search;
}

这是您在不直接访问 iVar 时的方法调用:

[search testSearch:searchText];
于 2013-06-13T20:06:49.147 回答