In your calculation you would have to check if [components weekday]
is less or greater
than 2 (Monday) and modify the components accordingly to get the previous Monday.
But you can simplify the calculation to:
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
// [gregorian setLocale:[NSLocale currentLocale]]; (This is the default.)
[gregorian setFirstWeekday:2]; // 2 = Monday
[gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
NSDate *beginningOfWeek;
[gregorian rangeOfUnit:NSWeekCalendarUnit startDate:&beginningOfWeek interval:NULL forDate:date];
This gives 2014-04-14 00:00:00 +0000 (a Monday) as expected.
Remark: You should check if you really want to set the time zone to GMT. If you don't set a time zone then you will get the beginning of the week according to your local time zone.