Первая часть в @interface - это объявление ivar. Вам больше не нужно делать это, если вы объявляете собственность. На самом деле, это хорошая идея прекратить это делать, потому что это частная деталь реализации, которую вы раскрываете в своем заголовке.
Вторая часть - это объявление свойства. Это все, что вам действительно нужно. Однако, если вы объявляете свойство, вам также необходимо синтезировать методы доступа. В своем файле .m в верхней части блока @implementation
просто вставьте
@synthesize button;
@synthesize
сообщает свойству, какой ivar использовать для своего резервного хранилища. А в современных средах исполнения (то есть iOS и 64-битной OS X) он также синтезирует ивар для вас. Поэтому я думаю, что если вы пишете 32-битный код OS X, вам все равно нужно объявление ivar, но это единственный раз.