方法没有被调用

我已经将button链接到以下方法:

- (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"); } 

我最终的输出,当我点击search,只是“大声笑”(每次我点击button)。 它不会打印“HELLO”,因为testSearch应该这样做。 我在Search.h中包含了testSearch,所以它应该是可访问的…为什么不调用这个方法?

你应该开始初始化你的_search伊娃到你的指定初始化程序(或在viewDidLoad或其他“用户会使用这个”方法)的Search实例。

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

通常应避免getter方法中的延迟初始化,原因有很多:

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

  • 一个执行延迟初始化的getter会产生一个导致突变的getter。 这是不一致的,当调用一个getter时,看到一个KVO变更通知是非常奇怪的(当然,除非你没有发出KVO通知…在这一点上,你有不可观察的变异)。

  • 一个导致变异的getter本身并不是线程安全的,除非你添加了代码,棘手的代码,这样做。

  • 延迟初始化通常是一个不成熟的优化。 除非由于“过早”初始化资源而导致可识别的内存或CPU性能问题,否则添加延迟初始化的复杂性是浪费时间。

  • 延迟初始化可能会导致奇怪的sorting依赖性和其他复杂性。 最好有一个已知的入口点来初始化一个子系统,而不是依赖子系统X在Y之前被初始化,两者都是副作用。

您正在发送消息的search对象尚未实例化,因此您正在向nil发送消息。 在Obj-C中,这不会使程序崩溃,而是什么都不做。 Objective-C编程中的最佳实践是在iVar的getter方法中执行惰性实例化。 另外,你必须将这个最佳实践与不直接访问你的iVar,并使用setter和getters来设置你试图访问的iVar。 下面是您的searchiVar的getter方法中的惰性实例化示例:

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

这里是你的方法调用,而不是直接访问iVar:

 [search testSearch:searchText];