Is there anyway to check if my app calls any method exclusive for iOS 8? - ios7

After testing my app in a iOS 7 device, I got a crash calling containsString from NSString, and then I realised that that methods has NS_AVAILABLE(10_10, 8_0);
Is there anyway to check automatically my program to see if there is any other method that is not available in iOS 7?
How is possible to compile and app with deployment target of 7.0 and not saying any warning or error in these cases?
-[__NSCFString containsString:]: unrecognized selector sent to instance 0x1702297c0
2015-10-23 12:03:37.655 WA[1434:60b] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString containsString:]: unrecognized selector sent to instance 0x1702297c0'
* First throw call stack:
(0x183bd2f50 0x1900dc1fc 0x183bd7c04 0x183bd5930 0x183af55dc 0x1002a2c08 0x1000c71dc 0x1000caa88 0x1000c69bc 0x1000f3a4c 0x186c1055c 0x186c0ff08 0x186c099ec 0x186b9d8cc 0x186b9cad0 0x186c09044 0x1897bb504 0x1897bb030 0x183b92e90 0x183b92df0 0x183b91014 0x183ad1c20 0x186c081c8 0x186c02fdc 0x1000b6040 0x1906cfaa0)
libc++abi.dylib: terminating with uncaught exception of type NSException

You should use rangeOfString instead of containsString. Since rangeOfString available from iOS 2.0, you will not get crash on this.
Code snippets,
NSString *string = #"https://www.google.co.in/";
NSString *substring = #"http";
if ([oneContent rangeOfString:subString].location == NSNotFound) {
NSLog(#"string does not contain substring");
} else {
NSLog(#"string contains substring!");
}
Otherwise you can add category class for NSString and have a method like containsString: where you can implement the above code. It'll work dynamically.

Related

core data tableView crash

As the name states I am working with UITableView and CoreData. I have a custom UITableViewCell which has title and detail label. In my cellForRowAtIndexPath it crashes. I have found the issue I was passing NULL but the issue is it doesn't crash at
cell.detailLabel.text = [[factors valueForKey:#"factorsdescription"] lastObject];
but after many times cellForRowAtIndexPath is called and even on that cell in which I'm not passing null. any ideas?
crash Log
[NSNull length]: unrecognized selector sent to instance 0x34ed3690
2015-08-20 18:58:37.364 MASTER[1535:89769] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull length]: unrecognized selector sent to instance

NSString.length causes crash (NSInvalidArgumentException)

I have a iPad app (XCode 6.1.1, iOS 8.1, ARC) that when I run it on the 8.1 simulator, the app crashes comparing the length of a string. This has been running for over a year, and stopped yesterday. This is the code:
This is the code in the .h file:
#property NSString *shopOpenHour;
#property NSString *shopCloseHour;
This is the code in the .m file:
#synthesize shopOpenHour;
#synthesize shopCloseHour;
and:
if(shopOpenHour.length == 0 || shopCloseHour.length == 0) {
and this also causes a crash:
NSLog(#"\n\nlength test: %d", (int)shopCloseHour.length);
This is the error I'm getting:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber length]: unrecognized selector sent to instance 0xb000000000003203'
It runs fine when running under a 7.1 simulator and a iPad running iOS 8.1. I don't understand where/why NSCFNumber is "in the picture".
My question is: any ideas of what's causing this (before I submit a RADAR?)
Somewhere you have assigned a NSNumber to shopCloseHour, it can happen when assigning value from json .Check
if ([shopCloseHour isKindOfClass:[NSString class]]) {
// this is a string …
}

NSUserDefaults crashes when adding empty array

I just moved to iOS 8, installed Xcode 6 etc.
This code worked nicely on iOS 7 and 6. It even seems to work on an iPhone 4S with iOS 8 installed. But on iPhones 5 and 5S it crashes. (8.0.0 and 8.0.2 alike)
It does not matter whether the app is build against SDK 7 or 8. It crashes in both cases at the same stage.
The .h file contains:
#property (nonatomic, strong) NSMutableArray* filterBrandsExclude;
from the .m file:
// Following lines just to set the conditions for your understanding:
_filterBrandsExclude = [[NSMutableArray alloc] initWithCapacity:0]; // just creates an empty array.
// As a matter of fact, this array may well be empty and it worked nicely on older iOS versions.
// this line crashes:
[userDefaults setObject:_filterBrandsExclude forKey:#"filterBrandsExclude"];
Error Message:
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSKeyValueSlowMutableArray getObjects:range:]: value for key filterBrandsExclude of object 0x17004ae00 is nil'
*** First throw call stack:
(0x1885c6084 0x198bac0e4 0x1885c5fc4 0x18946097c 0x189460a68 0x189460ab0 0x1884c24d0 0x18854be90 0x1884c21c0 0x1884c17e8 0x188627c80 0x188552d9c 0x188551e9c 0x188600290 0x1885ff840 0x1886030e4 0x1893bb750 0x100053e5c 0x1000522a4 0x18cfd65d4 0x18cfdead0 0x18cfdea58 0x18cfd238c 0x1907d1640 0x18857e360 0x18857d468 0x18857ba8c 0x1884a9664 0x1915eb5a4 0x18cdae984 0x1000515f4 0x19921aa08)
libc++abi.dylib: terminating with uncaught exception of type NSException
Any idea is appreciated.
you can manually check
if(self.filterBrandsExclude != nil && self.filterBrandsExclude.count > 0)
[userDefaults setObject:_filterBrandsExclude forKey:#"filterBrandsExclude"];
else
[[NSUserDefaults standardUserDefaults] removeObjectForKey:#"filterBrandsExclude"];
Two things.
In your error it says that the value for the key filterBrandsInclude is nil, but in your question you reference the key filterBrandsExclude. Are you sure you've pinpointed the actual error at this point?
EDIT: Point #2 is invalid.

assigning values in NSArrays

Objective C gives me a run-time error for the indicated line of code
-(void) play: (int)i at: (int)j {
if ([self.board[i][j] isEqualToString:#""]){
if (xplays) {
self.board[i][j] = #"x"; //<-----HERE
}
else
self.board[i][j] = #"x";
}
xplays = !xplays;
}
board is a property. The error message is
[__NSArrayI replaceObjectAtIndex:withObject:]: unrecognized selector sent to instance 0x7123120
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI replaceObjectAtIndex:withObject:]: unrecognized selector sent to instance 0x7123120'
Do I need to use C-arrays for this kind of assignment?
You should be using an NSMutableArray.

iOS Error - "unrecognized selector"

Main.m
NSDictionary *additionalQueryParameters = [NSURL ab_parseURLQueryString:[url query]];
OAuth.h
#interface NSURL (OAuthAdditions)
+ (NSDictionary *)ab_parseURLQueryString:(NSString *)query;
#end
OAuth.m
#implementation NUSL (OAuthAdditions)
+ (NSDictionary *)ab_parseURLQueryString:(NSString *)query
{
does something..
}
When it runs that line, it throws this error...
2012-12-03 15:10:58.506[12500:1d403] +[NSURL ab_parseURLQueryString:]:
unrecognized selector sent to class 0xaece26c
2012-12-03 15:10:58.508[12500:1d403] * Terminating app due to
uncaught exception 'NSInvalidArgumentException', reason: '+[NSURL
ab_parseURLQueryString:]: unrecognized selector sent to class
0xaece26c'
* First throw call stack: (0xada8012 0xa3d6e7e 0xae332ad 0xad97bbc 0xad9794e 0x17b5ee8 0x17b5724 0x17b58d6 0xa84f53f 0xa861014 0xa8522e8
0xa851fcb 0x96097b24 0x960996fe) libc++abi.dylib: terminate called
throwing an exception
Any idea why it can't find it and how to fix it? Thanks.
Make sure OAuth.m is actually in the target and building in your project....
Your category implementation (OAuth.m) is named NUSL, not NSURL. The compiler is fine with the method since the category interface (header) is named correctly.