NSUserDefaults
is a valid way of both persisting information and accessing it across multiple classes, so there is nothing wrong with your technique from that point of view.
What I would look at is the need to store 50 different values. If levels can only be unlocked sequentially - i.e. You must complete all the levels 1-39 before you can attempt level 40, then all you need to do is store a single NSInteger that represents the highest completed level.
e.g. When you complete level 38, you would do something like
NSInteger highLevel=38;
[[NSUserDefaults standardUserDefaults] setInteger:highLevel forKey:@"highLevel"];
The first time your app runs you would need to set the NSUserDefault value to 0.
Without seeing your code, I can't give you the next bit exactly, but it would be something like:
NSInteger highLevel=[[NSUserDefaults standardUserDefaults] integerForKey:@"highLevel"];
for (int i=0;i<NUMBEROFLEVELS;i++)
{
if (i<=highLevel) {
// TODO Display unlocked level button
}
else {
// TODO Display locked level button
}
}
Note that setting highLevel to 0 actually unlocks level 1 because the first element of your array will actually be 0. When highLevel is 1 then element 0 and 1 (levels 1 and 2) are unlocked and so on...